如何解决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中使用是不实际的,而且很难从底部填充到顶部。
解决方法
方法将是这样的:
- 为每个值创建一个节点
- 将每个节点作为子节点添加到其父节点
- 找到所有非根节点,即所有属于另一个节点的子节点。
- 查找所有根节点,即步骤3的逆过程。
具有一些假设的示例:
-
该表以id和parent-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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。