這裏這樣做的遞歸的方式:
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);
}
}
如果您想擁有所有的操作在一個循環中,有一個循環做到這一點。但在我看來,閱讀起來要困難得多。
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。在某些情況下,特別是當您擁有大量物品的深層樹木時,這種方式會更加高效。如果你想在UI認識到,你需要使用ObservableCollection<Node>
變化
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];
parent[nodeToDelete.ParentId].Children.Remove(id);
}
,雖然:如果你想刪除某一個項目,像這樣做。
可以刪除節點的孩子嗎? – Joe
如果您希望UI反映更改,則需要使用observablecollections而不是列表。 – mdm20
LINQ只是查詢,你不能用LINQ「刪除」。 –