使用递归在嵌套列表中查找指定的字符串并添加新的

Find specified string in nested lists with recursion and add new

我无法编写一个带 3 个参数的函数 Func(ObservableCollection<Node> list, value_for_search, value_for_add) 搜索了所有嵌套列表,如果 Name 匹配,则添加更多级别的数据。

public class Node
{
    public string Name { get; set; }
    public ObservableCollection<Node> Child { get; set; }
}
ObservableCollection<Node> nodes;
nodes = new ObservableCollection<Node>
{
    new Node
    {
        Name = "1.1",
    },
    new Node
    {
        Name = "1.2",
        Child = new ObservableCollection<Node>
        {
            new Node {Name="2.1" },
            new Node {Name="2.2" },
            new Node {Name="2.3" },
        }
    },
};

我以为它应该递归遍历所有级别。 添加后应该是这样的。

nodes = new ObservableCollection<Node>
{
    new Node
    {
        Name = "1.1",
    },
    new Node
    {
        Name = "1.2",
        Child = new ObservableCollection<Node>
        {
            new Node {Name="2.1" },
            new Node {Name="2.2" },
            //After adding
            new Node 
            {
                Name="2.3",
                Child = new ObservableCollection<Node> 
                {
                    new Node {Name = "3" } 
                }
            }
        }
    },
};
void Func(ObservableCollection<Node> list, string value_for_search, string value_for_add)
{
    foreach (var node in list)
    {
        if (node.Name == value_for_search)
        {
            node.Children ??= new ObservableCollection<Node>(); // Create collection if null
            node.Children.Add(new Node { Name = value_for_add }); // Add a new child node
        }

        if (node.Child != null)
        {
            Func(node.Child, value_for_search, value_for_add); // Recurse
        }
    }
}

我建议创建一个通用方法,它枚举整个节点层次结构:

public class Node
{
    public string Name { get; set; }
    public ObservableCollection<Node> Child { get; set; }

    public void Add(Node node)
    {
        if (Child == null)
            Child = new ObservableCollection<Node>();
        Child.Add(node);
    }
    
    public static IEnumerable<Node> Hierarchy(IEnumerable<Node> nodes)
    {
        if (nodes == null)
            yield break;
        foreach(var node in nodes)
        {
            yield return node;
            foreach(var child in Node.Hierarchy(node.Child))
            {
                yield return child;
            }
        }
    }
}

然后使用Linq方法按名称搜索节点:

var parent = Node.Hierarchy(nodes).FirstOrDefault(n => n.Name == "2.3");
if (parent != null)
{
    parent.Add(new Node { Name = "3" });
}