c# - Linq 递归搜索节点

标签 c# linq

试图获得所有List<Node>()的最后列表那不是空的。如何对子节点执行此操作?

public class Node
{
    public string Name { get; set; }

    public List<Node> Nodes { get; set; }
}

public class Program
{
    static void Main(string[] args)
    {
        List<Node> Items = new List<Node>();
        Items.Add(new Node { Name = "Test0" });
        Items.Add(new Node { Name = "Test1" });
        Items.Add(new Node { Name = "Test2" });
        Items.Add(new Node { Name = "Test3" });
        Items.Add(new Node { Name = "Test4" });
        Items.Add(new Node { Name = "Test5" });
        Items.Add(new Node
        {
            Name = "Test6",
            Nodes = new List<Node>
            {
                new Node
                {
                    Name = "Test6.1",
                    Nodes = new List<Node>
                    {
                        new Node
                        {
                            Name = "Test6.1.1", Nodes = new List<Node>()
                        }
                    }
                },

            }
        });
        Items.Add(new Node { Name = "Test7", Nodes = new List<Node> { } });
        Items.Add(new Node { Name = "Test8", Nodes = new List<Node> { } });

        var NotNullNodes = Items.SelectMany(m => m.Nodes);
    }
}

最佳答案

另一个 linq 递归解决方案:

public static IEnumerable<Node> GetAllNodes( Node root )
{
    if( root == null )
    {
        yield break;
    }

    yield return root;

    if ( root.Nodes == null )
    {
        yield break;
    }

    foreach ( Node descendant in root.Nodes.SelectMany( GetAllNodes ) )
    {
        yield return descendant;
    }
}

像这样使用:

Items.SelectMany( GetAllNodes )

关于c# - Linq 递归搜索节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56001282/

相关文章:

c# - 左加入两个列表并使用 Linq 从右边维护一个属性

c# - 当查询包含连接时,如何在 crm sdk 2011 linq 查询中使用谓词?

c# - 为什么这个Linq表达式比另一个表达式慢很多?

c# - 如何从 html 字符串(如编号目录)中仅提取标题(即 h2、h3、h4)?

c# - SQL Server 相当于 Oracle 'byte'

c# - ASP.NET MVC 上传文件超时

c# - LINQ 表达式中不区分大小写的字符串比较

c# - 检查列表是否包含两个不同派生类型的元素

c# - 当调用来自系统命名空间的函数时,c 锐利的编译器如何工作?

c# - 检查字符串是否包含字典键 ->删除键并添加值