首页 > 解决方案 > 获取按级别排序的父级的所有子级

问题描述

我有这张按级别排序的表

name    parentId    id  level
Dep 1   0           1    0  
Dep 2   1           2    1  
Dep 6   2           6    2  
Dep 4   1           4    1  
Dep 5   4           5    2
Dep 3   0           3    0  

让父母的所有孩子的最佳方法是什么?我想过使用字典来存储所有的 id,然后创建一个递归函数来搜索每个父母的所有孩子。但是由于它已经按级别排序,我真的需要一个递归函数还是人工智能可以以迭代的方式来完成它?

预期结果:

[  
   {
     "id"   : "1", 
     "name" : "Dep1",
     "children": [
        {
           "id"  : "2", 
           "name" : "Dep2",
           "children": [
              {
               "id"  : "6", 
               "name" : "Dep6"
              }
           ]
        }
      ]
     "id"   : "4", 
     "name" : "Dep4",
     "children": [
        {
           "id"  : "5", 
           "name" : "Dep5"
        }
     ]
     {
     "id"   : "3", 
     "name" : "Dep3"
     }
  }
]

标签: c#tree

解决方案


我会采取这种方法:

List<Data> data = new List<Data>()
{
    new Data() { Name = "Dep 1", ParentId = 0, Id = 1, Level = 0 },
    new Data() { Name = "Dep 2", ParentId = 1, Id = 2, Level = 1 },
    new Data() { Name = "Dep 6", ParentId = 2, Id = 6, Level = 2 },
    new Data() { Name = "Dep 4", ParentId = 1, Id = 4, Level = 1 },
    new Data() { Name = "Dep 5", ParentId = 4, Id = 5, Level = 2 },
    new Data() { Name = "Dep 3", ParentId = 0, Id = 3, Level = 0 },
};

var lookup = data.ToLookup(x => x.ParentId);

List<Result> GetChildren(int parentId) =>
    lookup[parentId]
        .Select(c => new Result()
        {
            Id = c.Id,
            Name = c.Name,
            Children = GetChildren(c.Id)
        })
        .ToList();

List<Result> result = GetChildren(0);

这给出了:

[
  {
    “身份证”:1,
    "名称": "Dep 1",
    “孩子们”: [
      {
        “身份证”:2,
        "名称": "Dep 2",
        “孩子们”: [
          {
            “身份证”:6,
            "名称": "Dep 6",
            “孩子们”: []
          }
        ]
      },
      {
        “身份证”:4,
        “名称”:“Dep 4”,
        “孩子们”: [
          {
            “身份证”:5,
            "名称": "Dep 5",
            “孩子们”: []
          }
        ]
      }
    ]
  },
  {
    “身份证”:3,
    "名称": "Dep 3",
    “孩子们”: []
  }
]

我同意这需要在大型数据集上进行测试,以查看它是否具有内存或计算限制。


推荐阅读