我在尝试删除树状对象内的项目时遇到了麻烦。

我的对象如下

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,但是我将为构造函数的子级参数设置父级和集合。

10-05 20:33
查看更多