How to flatten tree via LINQ?

后端 未结 14 2464
抹茶落季
抹茶落季 2020-11-22 04:56

So I have simple tree:

class MyNode
{
 public MyNode Parent;
 public IEnumerable Elements;
 int group = 1;
}

I have a I

14条回答
  •  南方客
    南方客 (楼主)
    2020-11-22 05:49

    void Main()
    {
        var allNodes = GetTreeNodes().Flatten(x => x.Elements);
    
        allNodes.Dump();
    }
    
    public static class ExtensionMethods
    {
        public static IEnumerable Flatten(this IEnumerable source, Func> childrenSelector = null)
        {
            if (source == null)
            {
                return new List();
            }
    
            var list = source;
    
            if (childrenSelector != null)
            {
                foreach (var item in source)
                {
                    list = list.Concat(childrenSelector(item).Flatten(childrenSelector));
                }
            }
    
            return list;
        }
    }
    
    IEnumerable GetTreeNodes() {
        return new[] { 
            new MyNode { Elements = new[] { new MyNode() }},
            new MyNode { Elements = new[] { new MyNode(), new MyNode(), new MyNode() }}
        };
    }
    
    class MyNode
    {
        public MyNode Parent;
        public IEnumerable Elements;
        int group = 1;
    }
    

提交回复
热议问题