我在尝试删除树状对象内的项目时遇到了麻烦。
我的对象如下
TreeNode
{
string name;
ObservableCollection<TreeNode> Children;
}
我以为如果我递归地处理树并找到我的节点并删除它,但我遇到了麻烦。
我做了一些类似的事情
更新:
DeleteNode(ObservableCollection<TreeNode> children, TreeNode nodetodelete)
{
if(children.remove(nodetodelete))
{
return;
}
else
{
foreach(var child in children)
{
DeleteNode(child, nodetodelete);
}
}
}
我意识到在编写代码时,我最终会在遍历有可能被更改的集合时遇到操作异常。
我可以构建for循环的巨大变化,因为我确切地知道了最大深度长度(这是我对占位符所做的),但这似乎真的很糟糕。 。 。 。
谁能指出我的总体方向。我有点想知道我的数据结构是否是造成这种情况的原因。
更新:
这看起来很糟糕,有点代码味道,但是我可以递归到“工作”了
找到我的节点时抛出异常。
DeleteNode(children, nodetodelete)
{
if(children.remove(nodetodelete)
{
throw FoundException();
}
else
{
foreach(var child in children)
{
DeleteNode(child, nodetodelete)
}
}
}
是否有其他方法可以打破递归。
最佳答案
我可以通过对我的设计进行一些小的更改来解决此问题(假设您问题中的代码段是某个类的伪代码):
TreeNode
{
string name;
TreeNode Parent;
ObservableCollection<TreeNode> Children;
public void Delete()
{
Parent.Children.Remove(this);
}
}
这为您在处理对象图时维护额外的引用提供了更多的工作,但是在进行诸如删除之类的操作时,如上面所示,可以节省大量的工作量和代码。
您尚未显示如何构造
TreeNode
,但是我将为构造函数的子级参数设置父级和集合。