微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#从底部到顶部填充层次结构树

如何解决C#从底部到顶部填充层次结构树

我必须从下至上填充一个层次结构树,从一个节点开始直到其根节点: 我有一个表,表中有多对一关系,其中包含下属的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中使用是不实际的,而且很难从底部填充到顶部。

解决方法

方法将是这样的:

  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;
     }
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?