c# - 删除第 N 级嵌套集合中的项目

标签 c# recursion

我在尝试删除树结构对象中的项目时遇到问题。

我的对象如下

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,但我会为构造函数的子参数创建父级和集合。

关于c# - 删除第 N 级嵌套集合中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30689905/

相关文章:

c# - 如何从 SortedDictionary 获取上一个键?

c# - 如何访问主窗体公共(public)属性 WPF

python - parsec.py 递归定义

sql - Material list 的递归查询

c# - List<T>.AsReadOnly() 与 IReadOnlyCollection<T>

c# - C# 中空泛型参数 <,> 的术语是什么?

c# - 从 MySQL 中获取元组的值到字符串数组

仅使用全局变量的递归

Java - 应用递归时线程 "main"java.lang.StackOverflowError 中出现异常

java - 某些文件上的堆栈溢出 - 查找 Sprite 的位置