从平面表中表示的父/子关系创建树
我有一个由存储过程返回的以下字段的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
我需要从这个输出中构造一个嵌套对象列表
因此,承运人的每个对象都应该列出所有孩子的名单。 任何人都可以帮我构建一个LINQ代码来实现这一目标吗?
期望的结果:
CarrierId = 1 |__________________ CarrierId = 2 | |__________________ CarrierId = 3 | | |___________________ CarrierId = 4 CarrierId = 5
期望的结果应如上所述
以下代码在树中排列,但子项仍显示在列表中
c.Children = carrierList.Where(child => child.ParentCarrierId == c.CarrierId).ToList(); CarrierId = 1 | |__________________ CarrierId = 2 | |__________________ CarrierId = 3 | |___________________ CarrierId = 4 | CarrierId = 2 | CarrierId = 3 | CarrierId = 4 | CarrierId = 5
我不想要这种行为。 如果某些内容显示为Child,则应将其从root中删除。
这就是你需要的。
首先,从源数据开始:
var source = new [] { new { CarrierId = 1, ParentCarrierId = (int?)null, Name = "A", Description = "AA", }, new { CarrierId = 2, ParentCarrierId = (int?)1, Name = "B", Description = "BB", }, new { CarrierId = 3, ParentCarrierId = (int?)1, Name = "C", Description = "CC", }, new { CarrierId = 4, ParentCarrierId = (int?)3, Name = "D", Description = "DD", }, new { CarrierId = 5, ParentCarrierId = (int?)null, Name = "E", Description = "EE", }, };
然后,通过ParentCarrierId
创建一个查找:
var lookup = source.ToLookup(x => x.ParentCarrierId);
现在我们需要一个输出结构:
public class Carrier { public int Id; public List Children = new List (); public string Name; public string Description; }
然后, build
函数通过ParentCarrierId
弹出所有载体:
Func> build = null; build = pid => lookup[pid] .Select(x => new Carrier() { Id = x.CarrierId, Name = x.Name, Description = x.Description, Children = build(x.CarrierId), }) .ToList();
注意:它是递归的,因此需要使用initial = null
来定义。
最后我们建立:
List trees = build(null);
这给出了: