Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C从下到上填充层次结构树_C#_Tree_Hierarchy_Bottom - Fatal编程技术网

C# C从下到上填充层次结构树

C# C从下到上填充层次结构树,c#,tree,hierarchy,bottom,C#,Tree,Hierarchy,Bottom,我必须从下到上填充层次结构树,从一个节点到它的根节点: 我有一个内部有多对一关系的表,其中包含下级的id和上级的id PK | SUBORDINATE_ID | SUPERIOR_ID 1 | 50 | 22 2 | 51 | 22 3 | 52 | 22 4 | 22 | 10 5 | 10 | 1 6 | 60

我必须从下到上填充层次结构树,从一个节点到它的根节点: 我有一个内部有多对一关系的表,其中包含下级的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的使用中并不实用,而且很难从下到上填充。

方法如下:

为每个值创建一个节点 将每个节点作为子节点添加到其父节点 查找所有非根节点,即其他节点的子节点。 查找所有根节点,即与步骤3相反。 带有一些假设的示例:

该表以id和父id的列表形式给出

根通过具有相同的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;
 }

方法如下:

为每个值创建一个节点 将每个节点作为子节点添加到其父节点 查找所有非根节点,即其他节点的子节点。 查找所有根节点,即与步骤3相反。 带有一些假设的示例:

该表以id和父id的列表形式给出

根通过具有相同的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;
 }

我必须填写一个从下到上的层次结构树-你能澄清这一点吗?从下到上是什么意思?无论是从下到上还是从后,都需要先对数据进行排序。看到这个解决方案,你可能会根据你的需要调整它-因为许多下属只能有一个上级,你可以先按上级ID分组,这样你就可以把所有的孩子放在一个地方。我必须从下到上填充一个层次树-你能澄清这一点吗?从下到上是什么意思?无论是从下到上还是从后,都需要先对数据进行排序。看到这个解决方案,你可能会根据你的需要调整它-因为许多下属只能有一个上级,你可以先按上级分组,这样你就可以让所有的孩子都在一个地方。