使用递归在嵌套列表中查找指定的字符串并添加新的
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" });
}
我无法编写一个带 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" });
}