Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ从树中的所有节点获取列表?_C#_.net_Linq - Fatal编程技术网

C# 如何使用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 {

如何使用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 { 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:我明白了。如果这是您的需求,您可以轻松地将这些方法放在一个单独的类中,因为它们只需要访问公共属性。您可以将它们标记为扩展方法,以简化使用语法。