c# - 使用 LINQ 表达式创建树

标签 c# linq multidimensional-array

我有一个由存储过程返回的以下字段的 C# 列表:

CarrierId   ParentCarrierId Name Descrition
1            NULL            A         AA
2              1             B         BB
3              1             C         CC
4              3             D         DD
5            NULL            E         EE

我需要根据这个输出构造一个嵌套的对象列表

所以 Carrier 的每个对象都应该有它所有子对象的列表。任何人都可以帮助我构建 LINQ 代码来完成此任务吗?

期望的结果:

 CarrierId = 1
      |__________________ CarrierId = 2
      |__________________ CarrierId = 3
                              |___________________ CarrierId = 4

 CarrierId = 5

想要的结果应该是上面提到的

最佳答案

首先创建一个将父 ID 映射到其子 ID 的查找:

var lookup = carriers.ToLookup(carrier => carrier.ParentCarrierId);

遍历每个节点并根据查找分配其子节点:

foreach(var carrier in carriers)
    carrier.Children = lookup[carrier.CarrierId];

要获取所有根节点,只需从查找中获取空值:

var roots = lookup[null];

请注意,整个操作是 O(n),因为构建查找是 O(n),并且可以在 O(n) 时间内找到每个单个运营商的所有子项,而不是花费 O(n^2) ) 时间与发布的其他解决方案一样(因为他们使用 O(n) 操作来查找单个节点的所有子节点)。这使得这段代码比其他选项快得多,而且更简单、更短。

关于c# - 使用 LINQ 表达式创建树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33915323/

相关文章:

c - 如何检查我的数组是否按升序排列?

c# - 您如何确保 .Net 始终从 namespace 树的根部搜索 namespace ?

c# - 如何在 linq to NHibernate 中使用 select for associations

c# - 对 List<string> 进行排序,如 Excel 列排序

linq - lambda 表达式中的计数

Javascript - 将多维数组与索引相结合

c - 二维指针的大小

javascript - 将用户登录到 OneDrive

c# - 将项目绑定(bind)到 ListBox 多列

c# - 注册用户的激活邮件 MVC