我有这两种方法
public static void NavigateAndExecute(Node root, Action<Node> actionToExecute)
{
if (root == null || root.Children == null || root.Children.Count == 0)
return;
actionToExecute(root);
foreach (var node in root.Children)
{
actionToExecute(node);
NavigateAndExecute(node, actionToExecute);
}
}
public static void NavigateAndExecute(List<Node> root, Action<Node> actionToExecute)
{
if (root == null || root.Count == 0)
return;
foreach (var node in root)
{
NavigateAndExecute(node, actionToExecute);
}
}
节点类是
public class Node
{
public String Name { get; set; }
public List<Node> Children { get; set; }
}
这两种方法只适用于Node类,可以使它们适用于任何类型的T 任何帮助。
答案 0 :(得分:2)
您可以为IEnumerable<T>
创建一个带有子选择器 Func<T, IEnumerable<T>>
的静态扩展方法:
public static void TraverseAndExecute<T>(this IEnumerable<T> items, Func<T, IEnumerable<T>> selector, Action<T> actionToExecute)
{
if (items != null)
{
foreach (T item in items)
{
actionToExecute(item);
TraverseAndExecute(selector(item), selector, actionToExecute);
}
}
}
使用Node
课程:
List<Node> nodes = // ...
nodes.TraverseAndExecute(n => n.Children, n => /* action here */);
答案 1 :(得分:1)
我看到您正在访问node.Children
,这似乎是Node
类特有的属性。因此,只需将方法转换为通用方法,您的代码就无法工作。
但是,您可以使用通用约束来实现此目的:
public static void NavigateAndExecute<T>(List<T> root, Action<T> actionToExecute) where T: Node
答案 2 :(得分:1)
我认为你想要一些我以前实施过的东西。请注意在main方法中使用新属性Name2
。
public static class Tree<N>
where N : Tree<N>.Node
{
public class Node
{
public String Name { get; set; }
public List<N> Children { get; set; }
}
public static void NavigateAndExecute(N root, Action<N> actionToExecute)
{
if (root == null)
return;
actionToExecute(root);
if (root.Children == null || root.Children.Count == 0)
return;
NavigateAndExecute(root.Children, actionToExecute);
}
public static void NavigateAndExecute(List<N> root, Action<N> actionToExecute)
{
if (root == null || root.Count == 0)
return;
foreach (var node in root)
{
NavigateAndExecute(node, actionToExecute);
}
}
}
public class Node2 : Tree<Node2>.Node
{
public string Name2 { get; set; }
}
class Program
{
static void Main(string[] args)
{
var root = new Node2();
Tree<Node2>.NavigateAndExecute(root, n => {
Console.WriteLine(n.Name2);
});
}
}
答案 3 :(得分:1)
您想要一个通用树集合。我在一年前写过一篇我开源的文章:
http://simplygenius.net/Article/TreeCollection2
我知道反对使用Tree数据结构的论据,但有时它们只是你需要的。