c# - 将平面集合转换为分层集合的递归方法?

标签 c# linq entity-framework

我已经在这个问题上停留了几天,希望能提供一些想法或帮助解决它。 我有一个对象集合

 public class Hierarchy
{
    public Hierarchy(string iD, string name, int level, string parentID, string topParent)
    {
        ID = iD;
        Name = name;
        Level = level;
        ParentID = parentID;
        Children = new HashSet<Hierarchy>();
    }
    public string ID { get; set; }
    public string Name{ get; set; }
    public int Level { get; set; }
    public string ParentID { get; set; }
    public ICollection<Hierarchy> Children { get; set; }
}

从 Linq 查询到我的实体的数据是:

ID      Name     Level ParentID
295152  name1    1     null
12345   child1   2     295152
54321   child2   2     295152
44444   child1a  3     12345
33333   child1b  3     12345
22222   child2a  3     54321
22221   child2b  3     54321
22002   child2c  3     54321
20001   child2a2 4     22222
20101   child2b2 4     22222

此数据可以扩展到未知深度的级别(我只显示 4 个)。 最终,我将拥有一个层次结构对象,其中包含多个子对象的集合,而这些子对象又可能包含多个子对象的集合……等等…… 永远只有一个顶级对象。

我正在尝试在这个项目中尽可能多地使用 Linq。

这显然需要某种递归方法,但我被卡住了。任何想法或帮助将不胜感激。

TIA

最佳答案

你可以试试这个递归函数:

void PopulateChildren(Hierarchy root, ICollection<Hierarchy> source)
{
    foreach (var hierarchy in source.Where(h => h.ParentID == root.ParentID))
    {
        root.Children.Add(hierarchy);
        PopulateChildren(root, source);
    }
}

你可以这样使用:

ICollection<Hierarchy> hierarchies = new List<Hierarchy>(); // source

// Get root
var root = hierarchies.Single(h => h.Level == 1);

// Populate children recursively
PopulateChildren(root, hierarchies);

关于c# - 将平面集合转换为分层集合的递归方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14271683/

相关文章:

c# - EF ToTraceString SQL 生成结果列顺序

c# - 如何获取两个平面网格的公共(public)部分?

c# - Visual Studio 2017 - 表达式交互发生了什么?

c# - 来自 c# 设计器 GUI 的 "find all references"

c# - 单元测试插入/更新/删除

c# - 底层提供程序在 Open iis 上失败

c# - 有windows服务好还是控制台应用好?

c# - 从 linq 查询填充数据表

c# - Linq lambda 表达式至少得到一个重复项和非重复项

entity-framework - 使用 MSBuild 构建 Entity Framework 模型而不使用项目文件?