C# C从下到上填充层次结构树
我必须从下到上填充层次结构树,从一个节点到它的根节点: 我有一个内部有多对一关系的表,其中包含下级的id和上级的idC# 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
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分组,这样你就可以把所有的孩子放在一个地方。我必须从下到上填充一个层次树-你能澄清这一点吗?从下到上是什么意思?无论是从下到上还是从后,都需要先对数据进行排序。看到这个解决方案,你可能会根据你的需要调整它-因为许多下属只能有一个上级,你可以先按上级分组,这样你就可以让所有的孩子都在一个地方。