C# 基于子选择仅选择并显示父节点
如何创建一个嵌套的层次结构列表:C# 基于子选择仅选择并显示父节点,c#,linq,list,C#,Linq,List,如何创建一个嵌套的层次结构列表: A--A1---A2 | | | A21 | B--B1---B2 | | | | B11 B21 | C--C1---C2 | | | | C11 C21 现在我的选择将只在叶节点上,即B21,那么只有B-B2--B21-应该在我的列表中 B----B2 | | | B21 | 我如何才能以更智能的方式或任何我将传递任何节点并显示其父节点的函数来执行此操作。因为获取一个节点及其所
A--A1---A2
| |
| A21
|
B--B1---B2
| | |
| B11 B21
|
C--C1---C2
| | |
| C11 C21
现在我的选择将只在叶节点上,即B21,那么只有B-B2--B21-应该在我的列表中
B----B2
| |
| B21
|
我如何才能以更智能的方式或任何我将传递任何节点并显示其父节点的函数来执行此操作。因为获取一个节点及其所有父节点的序列非常简单:
public static IEnumerable<T> Ancestors<T>(T node, Func<T, T> parentSelector)
{
T current = node;
while(current != null)
{
yield return current;
current = parentSelector(current);
}
}
您必须向我们提供更多关于代码结构的详细信息,以便我们能够帮助您完成这项工作。这完全取决于您存储和访问这些项目的方式。您只需查看直接的父节点-如果某个节点是所选节点的父节点,请将其包括在内,等等-您可以在while循环中执行此操作以避免递归,例如
while(node.parent!=null){nodeList.Add(node.parent);node=node.parent;}
@Mashton:问题已经更新,以阻止所有的-
和|
坍缩成一团。希望一次更新能够消除这种担忧…(删除了-
和|
注释,现在事情看起来很好)。您的数据在代码OP中是如何结构化的?节点知道其父节点、子节点还是两者都知道?B不是a的孩子吗?如果是这样的话,为什么在你的例子中没有提到这一点?图中显示的关系与B11与B1的关系相同,例如,列表中的A、B、C单个条目,每个节点都有子节点的集合,每个节点都保存其父引用。
var Ancestors = Ancestors(node, n => n.Parent);