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 )
推荐阅读
- qt - 在 Qt 的设计视图和代码视图中更改小部件的名称
- google-apps-script - 如何仅将电子邮件发送到谷歌表格中选定的电子邮件?
- sql - 根据条件从另一个表中插入一个表中的记录
- python - Pandas - 连接两个数据框并在新列上添加列值
- c# - 在 API 中使用 ActionResult 类方法
- sql-server - ConnectionError [SequelizeConnectionError]:无法连接到 localhost:1433 - 无法连接(序列)Node.js、Sequelize 和 Heroku
- python - NumPy 中高级索引的结果形状
- python - 有没有办法循环遍历熊猫数据框并根据条件删除行窗口?
- python - 现有数据库中的用户登录 Django 网站的问题
- arrays - 从 0,0 开始寻找棋盘上所有 3 个角的路径不起作用