private void foreachChildrenFlat(List <Tchild> Parents, DoItAlone doIt)
 {
     Element?.ForEach(localchild => {
         if (localchild.Me != null)
         {
             doIt(localchild);
         }
     });
     foreachChildrenFlat(Parents.SelectMany(x => x.Element).ToList(), doIt);
 }
        public List <Tchild> ToList()
        {
            List <Tchild> Res = new List <Tchild>()
            {
                (Tchild)this
            };
            DoItAlone doIt = new DoItAlone(new Action <Tchild>(me => Res.Add(me)));

            RunForeachChildren(doIt);
            return(Res);
        }
 private void foreachChildrenDown(Tchild Parents, DoItAlone doIt)
 {
     Parents?.Element?.ForEach(localchild =>
     {
         foreachChildrenDown(localchild, doIt);
         if ((localchild != null) && (localchild.Me != null))
         {
             doIt(localchild);
         }
     });
 }
 private void foreachChildrenUp(Tchild Parents, DoItAlone doIt)
 {
     Parents?.Element?.ForEach(localchild =>
     {
         if (localchild.Me != null)
         {
             doIt(localchild);
         }
         foreachChildrenUp(localchild, doIt);
     });
 }
        public List <Tchild> Where(Func <Tchild, bool> Delegate)
        {
            List <Tchild> Res  = new List <Tchild>();
            DoItAlone     doIt = new DoItAlone(new Action <Tchild>(me =>
                                                                   { if (Delegate(me))
                                                                 {
                                                                     Res.Add(me);
                                                                 }
                                                                   }));

            if (Delegate((Tchild)this))
            {
                Res.Add((Tchild)this);
            }
            RunForeachChildren(doIt);
            return(Res);
        }
 public void RunForeachChildren(DoItAlone doIt, EnumerationType EnumerationType = EnumerationType.FromDowntoUp)
 {
     if (EnumerationType == EnumerationType.FromDowntoUp)
     {
         foreachChildrenDown((Tchild)this, doIt);
         doIt((Tchild)this);
     }
     else if (EnumerationType == EnumerationType.FromUptoDown)
     {
         doIt((Tchild)this);
         foreachChildrenUp((Tchild)this, doIt);
     }
     else if (EnumerationType == EnumerationType.Flat)
     {
         doIt((Tchild)this);
         foreachChildrenFlat(((Tchild)this).Element, doIt);
     }
     else
     {
         throw new ArgumentException();
     }
 }
 public void RunForeachChildren(DoItAlone doIt)
 {
     foreachChildrenDown((Tchild)this, doIt);
 }