通过递归检查父子关系的C#编译树类型列表 [英] Build tree type list by recursively checking parent-child relationship C#
问题描述
我有一个具有其自身的列表,以便它可以重新$ P $以树结构psented一类
I have One class that has a list of itself so it can be represented in a tree structure.
我拉着这些类的平面列表,并希望unflatten它。
I am pulling a flat list of these classes and want to unflatten it.
public class Group
{
public int ID {get;set;}
public int? ParentID {get;set;}
public List<Group> Children {get;set;}
}
我希望能够做到以下几点
I want to be able to do the following
List<Group> flatList = GetFlatList() //I CAN ALREADY DO THIS
List<Group> tree = BuildTree(flatList);
相关ID属性其父组PARENTID如果wasnt明显。
The ParentID related to the ID property on its parent group if that wasnt obvious.
修改
有一些混乱,为什么我返回一个列表,而不是一个单一的对象。
There is some confusion as to why I am returning a list and not a single object.
我的建筑,项目列表的UI元素,每为什么有一个孩子。因此,最初的名单没有一个根节点。似乎所有的解决方案,至今没有工作。
I am building a UI element that has a list of items, each of why has a child. So the initial list DOES NOT have a root node. It seems all of the solutions so far do not work.
这意味着我需要基本使用组分类型结构的列表。
What this means is I essentially need a list of tree type structures using Group class.
推荐答案
我不知道为什么你希望你的 BuildTree
方法返回列表&LT;组&gt ;
- 树需要有根节点,所以你应该希望它返回一个组
元素,而不是一个列表
I have no idea why you want your BuildTree
method return List<Group>
- tree needs to have root node, so you should expect it to return single Group
element, not a list.
我要创建的扩展方法IEnumerable&LT;组&gt;
:
public static class GroupEnumerable
{
public static IList<Group> BuildTree(this IEnumerable<Group> source)
{
var groups = source.GroupBy(i => i.ParentID);
var roots = groups.FirstOrDefault(g => g.Key.HasValue == false).ToList();
if (roots.Count > 0)
{
var dict = groups.Where(g => g.Key.HasValue).ToDictionary(g => g.Key.Value, g => g.ToList());
for (int i = 0; i < roots.Count; i++)
AddChildren(roots[i], dict);
}
return roots;
}
private static void AddChildren(Group node, IDictionary<int, List<Group>> source)
{
if (source.ContainsKey(node.ID))
{
node.Children = source[node.ID];
for (int i = 0; i < node.Children.Count; i++)
AddChildren(node.Children[i], source);
}
else
{
node.Children = new List<Group>();
}
}
}
用法的
Usage
var flatList = new List<Group>() {
new Group() { ID = 1, ParentID = null }, // root node
new Group() { ID = 2, ParentID = 1 },
new Group() { ID = 3, ParentID = 1 },
new Group() { ID = 4, ParentID = 3 },
new Group() { ID = 5, ParentID = 4 },
new Group() { ID = 6, ParentID = 4 }
};
var tree = flatList.BuildTree();
这篇关于通过递归检查父子关系的C#编译树类型列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!