从平面表中表示的父/子关系创建树

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

这给出了:

树木