C# 如何使用LINQ从树中的所有节点获取列表?
如何使用LINQ从树中的所有节点获取列表 我的课程是:C# 如何使用LINQ从树中的所有节点获取列表?,c#,.net,linq,C#,.net,Linq,如何使用LINQ从树中的所有节点获取列表 我的课程是: class Node { public class Node() { Children = new List<Node>(); } public List<Node> Children { get; set;} } class Tree { public Tree() { Roots = new List<Node>(); } List<Node> Roots {
class Node
{
public class Node()
{
Children = new List<Node>();
}
public List<Node> Children { get; set;}
}
class Tree
{
public Tree()
{
Roots = new List<Node>();
}
List<Node> Roots { get; set;}
}
类节点
{
公共类节点()
{
Children=新列表();
}
公共列表子项{get;set;}
}
类树
{
公树()
{
根=新列表();
}
列表根{get;set;}
}
您可以通过添加或使用。我个人更喜欢第一种方法。类节点
class Node
{
public Node()
{
Children = new List<Node>();
}
public IEnumerable<Node> GetSubTree()
{
return Children.SelectMany(c => c.GetSubTree()).Concat(new[] { this });
//Post-order traversal
}
public List<Node> Children { get; set; }
}
class Tree
{
public Tree()
{
Roots = new List<Node>();
}
public IEnumerable<Node> GetAllNodes()
{
return Roots.SelectMany(root => root.GetSubTree());
}
List<Node> Roots { get; set; }
}
{
公共节点()
{
Children=新列表();
}
公共IEnumerable GetSubTree()
{
返回Children.SelectMany(c=>c.GetSubTree()).Concat(new[]{this});
//后序遍历
}
公共列表子项{get;set;}
}
类树
{
公树()
{
根=新列表();
}
公共IEnumerable GetAllNodes()
{
返回root.SelectMany(root=>root.GetSubTree());
}
列表根{get;set;}
}
一棵树怎么可能有多个根呢?这不是一个林吗?var allNodes=yourTree.root.SelectMany(x=>x.TraverseTree(y=>y.Children));
var allNodes = yourTree.Roots.SelectMany(x => x.TraverseTree(y => y.Children));
// ...
public static class EnumerableExtensions
{
public static IEnumerable<T> TraverseTree<T>(
this T parentNode, Func<T, IEnumerable<T>> childNodesSelector)
{
yield return parentNode;
IEnumerable<T> childNodes = childNodesSelector(parentNode);
if (childNodes != null)
{
foreach (T childNode in
childNodes.SelectMany(x => x.TraverseTree(childNodesSelector)))
{
yield return childNode;
}
}
}
}
// ...
公共静态类EnumerableExtensions
{
公共静态IEnumerable遍历树(
这是T parentNode,Func ChildNodeSelector)
{
收益返回节点;
IEnumerable childNodes=ChildNodeSelector(parentNode);
if(childNodes!=null)
{
foreach(T childNode in
childNodes.SelectMany(x=>x.TraverseTree(ChildNodeSelector)))
{
收益返回子节点;
}
}
}
}
不,不是,我有一个对象树,我需要对它进行一些查询,这是从下面的链接开始的博客:这可能是一个比你想要的更一般的讨论,但它会回答你的问题,除此之外还有很多…@Homan Func nodesForTree=tree=>tree.GetAllNodes();这就是你想要的吗?为什么呢?谢谢你的回答,我将使用你的代码,我想在不更改类主体的情况下进行查询,换句话说,在查询之前创建函数GetSubTree,并在查询中使用它,而不更改类。无论如何,再次谢谢你:)@Homan:我明白了。如果这是您的需求,您可以轻松地将这些方法放在一个单独的类中,因为它们只需要访问公共属性。您可以将它们标记为扩展方法,以简化使用语法。