1

我必须从下到上填充一个层次结构树,从一个节点开始到它的根节点:我有一个内部包含多对一关系的表,其中包含下属的 id 和上级的 id。

PK | SUBORDINATE_ID | SUPERIOR_ID
1  |       50       |    22
2  |       51       |    22
3  |       52       |    22
4  |       22       |    10
5  |       10       |     1
6  |       60       |     2
7  |       70       |     3
8  |       80       |     4 

如何有效地遍历表格并填充结构以满足我的需求?考虑到可能有多个根节点,我应该使用哪种结构?

例如,4 个联合创始人将是我的 4 个根节点,但将来他们可能会超过 4 个

一个可以满足我需要的结构将是这样的类列表

public class HierarchyMember
{
    public int Id { get; set; }
    public List<HierarchyMember> Children { get; set; }
}
 

但是在使用LINQ时并不实用,而且很难从下到上填充。

4

1 回答 1

3

该方法将是这样的:

  1. 为每个值创建一个节点
  2. 将每个节点作为子节点添加到其父节点
  3. 查找所有非根节点,即作为另一个节点的子节点的所有节点。
  4. 找到所有根节点,即步骤 3 的倒数。

带有一些假设的示例:

  1. 该表以 id 和 parent-id 列表的形式给出

  2. 根标记为具有相同的 id 和父 id,替换为适合您情况的任何内容。

     public class HierarchyMember
     {
         public int Id { get; }
         public List<HierarchyMember> Children { get; } = new List<HierarchyMember>();
         public HierarchyMember(int id) => Id = id;
     }
     public static IEnumerable<HierarchyMember> BuildTree(List<(int Id, int ParentId)> hierarchy)
     {
         var dictionary = hierarchy.ToDictionary(p => p.Id, p => new HierarchyMember(p.Id));
         foreach (var (id, parentId) in hierarchy)
         {
             if (id != parentId)
             {
                 dictionary[parentId].Children.Add(dictionary[id]);
             }
         }
    
         var nonRoots = dictionary.Values.SelectMany(p => p.Children).ToHashSet();
         var roots = dictionary.Values.Where(p => !nonRoots.Contains(p)).ToList();
         return roots;
     }
    
于 2020-09-07T15:31:00.600 回答