这是一种递归方式:
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>
。