检索树路径列表
Retrieve a list of tree paths
我目前有一棵树,我正在使用此处找到的代码 Functionally traversing a tree in C# 来获取树中的路径。问题是,这段代码目前 return 是我树中每条路径的列表。例如,如果我有以下树:
A---
|
---B
|
---C
|
---D
|
---E
代码将 return {A},{A,B},{A,C},{A,C,D},{A,C,E}
我实际上只需要 return 分支,即 {A,B},{A,C,D},{A,C,E}。
这不一定是上述方法的一部分,只要最后我得到的列表只是分支而不是每条路径即可。
我真正想弄清楚的是如何从上述方法中过滤 IEnumerable 列表,使其只包含每个列表中最后一个元素没有子项的条目。
所以在我当前的代码中:
class Node
{
public string Name;
public int ParentID;
public List<Node> Children;
}
然后在我的主代码中
List<Node> listOfNodes = getTreeNodes();
Node rootNode = listOfNodes.Where(n => n.ParentID == 0).FirstOrDefault();
// the below paths var will have every path instead of just the branches
var paths = ComputePaths(rootNode, n=>n.Children);
使用链接答案中的代码:
static IEnumerable<IEnumerable<T>> ComputePaths<T>(T Root, Func<T, IEnumerable<T>> Children) {
yield return new[] { Root };
foreach (var Child in Children(Root))
foreach (var ChildPath in ComputePaths(Child, Children))
yield return new[] { Root }.Concat(ChildPath);
}
希望这是有道理的。任何帮助将不胜感激。
这个有效:
static IEnumerable<IEnumerable<T>> ComputePaths<T>(T Root, Func<T, IEnumerable<T>> Children) {
var children = Children(Root);
if (children != null && children.Any())
{
foreach (var Child in children)
foreach (var ChildPath in ComputePaths(Child, Children))
yield return new[] { Root }.Concat(ChildPath);
} else {
yield return new[] { Root };
}
}
如果节点是叶节点(没有children),我们return本身。否则,我们return其children的路径。
我目前有一棵树,我正在使用此处找到的代码 Functionally traversing a tree in C# 来获取树中的路径。问题是,这段代码目前 return 是我树中每条路径的列表。例如,如果我有以下树:
A---
|
---B
|
---C
|
---D
|
---E
代码将 return {A},{A,B},{A,C},{A,C,D},{A,C,E}
我实际上只需要 return 分支,即 {A,B},{A,C,D},{A,C,E}。
这不一定是上述方法的一部分,只要最后我得到的列表只是分支而不是每条路径即可。
我真正想弄清楚的是如何从上述方法中过滤 IEnumerable 列表,使其只包含每个列表中最后一个元素没有子项的条目。
所以在我当前的代码中:
class Node
{
public string Name;
public int ParentID;
public List<Node> Children;
}
然后在我的主代码中
List<Node> listOfNodes = getTreeNodes();
Node rootNode = listOfNodes.Where(n => n.ParentID == 0).FirstOrDefault();
// the below paths var will have every path instead of just the branches
var paths = ComputePaths(rootNode, n=>n.Children);
使用链接答案中的代码:
static IEnumerable<IEnumerable<T>> ComputePaths<T>(T Root, Func<T, IEnumerable<T>> Children) {
yield return new[] { Root };
foreach (var Child in Children(Root))
foreach (var ChildPath in ComputePaths(Child, Children))
yield return new[] { Root }.Concat(ChildPath);
}
希望这是有道理的。任何帮助将不胜感激。
这个有效:
static IEnumerable<IEnumerable<T>> ComputePaths<T>(T Root, Func<T, IEnumerable<T>> Children) {
var children = Children(Root);
if (children != null && children.Any())
{
foreach (var Child in children)
foreach (var ChildPath in ComputePaths(Child, Children))
yield return new[] { Root }.Concat(ChildPath);
} else {
yield return new[] { Root };
}
}
如果节点是叶节点(没有children),我们return本身。否则,我们return其children的路径。