gpt4 book ai didi

c# - 从分层集合中删除对象

转载 作者:行者123 更新时间:2023-11-30 13:32:54 26 4
gpt4 key购买 nike

我在分层列表中有一组 NodeObject 类。该列表可以是任意数量的深度。

public class NodeModel : ViewModelBase
{
public Guid Id { get; set; }
public string Caption { get; set; }
public string Description { get; set; }
public NodeType Type { get; set; }
public List<NodeModel> Children { get; set; }
}

如何使用其 Guid Id 从列表中删除一个项目,而不管它在列表中的什么位置?

最佳答案

这是一种递归的方式:

private void DeleteNode(IList<Node> nodes, Guid id)
{
Node nodeToDelete = null;
foreach (var node in nodes)
{
if (node.Id == id)
{
nodeToDelete = node;
break;
}
DeleteNode(node.Children, id);
}
if (nodeToDelete != null)
{
nodes.Remove(nodeToDelete);
}
}

如果您想在一个循环中完成所有操作,请使用 for 循环。不过,在我看来,它更难阅读。

private void DeleteNode(IList<Node> nodes, int id)
{
for (var index = 0; index < nodes.Count; index++)
{
var currentNode = nodes[index];
if (currentNode.Id == id)
{
nodes.Remove(currentNode);
break;
}
DeleteNode(currentNode.Children, id);
}
}

另一种方法是使用平面(非分层)列表或甚至字典(最快的方法!),其中包含所有元素。您可以添加另一个属性,其中包含子项的父 ID。在某些情况下,特别是当你有很多项目的深树时,这种方式会更高效。如果你想删除某个项目,这样做:

private void DeleteNode(IList<Node> flatNodes, Guid id)
{
var nodeToDelete = flatNodes.FirstOrDefault(n => n.Id == id);
if (nodeToDelete != null)
{
var parent = flatNodes.First(n => n.Id == nodeToDelete.ParentId);
parent.Children.Remove(nodeToDelete);
}
}

private void DeleteNodeFromFlatDictionary(IDictionary<Guid, Node> flatNodes, Guid id)
{
if (!flatNodes.ContainsKey(id)) return;
var nodeToDelete = flatNodes[id];
flatNodes[nodeToDelete.ParentId].Children.Remove(id);
}

如果您希望 UI 识别您需要使用的更改 ObservableCollection<Node> , 不过。

关于c# - 从分层集合中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com