我有一个由存储过程返回的以下字段的 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/