Build tree type list by recursively checking parent-child relationship C#

前端 未结 3 827
暗喜
暗喜 2020-12-04 10:49

I have One class that has a list of itself so it can be represented in a tree structure.

I am pulling a flat list of these classes and want to unflatten it.

3条回答
  •  甜味超标
    2020-12-04 11:10

    I have no idea why you want your BuildTree method return List - tree needs to have root node, so you should expect it to return single Group element, not a list.

    I would create an extension method on IEnumerable:

    public static class GroupEnumerable
    {
        public static IList BuildTree(this IEnumerable 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> 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();
            }
        }
    }
    

    Usage

    var flatList = new List() {
        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();
    

提交回复
热议问题