2009-06-02 10 views
0

Gibt es einen LINQ-Weg, um dies zu erreichen? Jede Hilfe wird sehr geschätzt.Merge-Parent-Child-Eigenschaft mit Linq

class Program 
{ 
    static void Main(string[] args) 
    { 
     Parent parent1 = new Parent(); 
     parent1.Name = "P1"; 


     Parent parent2 = new Parent(); 
     parent2.Name = "P2"; 


     Child child1 = new Child(); 
     child1.Name = "C1"; 

     Child child2 = new Child(); 
     child2.Name = "C2"; 

     Child child3 = new Child(); 
     child3.Name = "C3"; 

     Child child4 = new Child(); 
     child4.Name = "C4"; 


     parent1.Children.Add(child1); 
     parent1.Children.Add(child2); 


     parent2.Children.Add(child3); 
     parent2.Children.Add(child4); 

     List<Parent> parentCollection = new List<Parent>(); 
     parentCollection.Add(parent1); 
     parentCollection.Add(parent2); 



     List<string> nameCollection = new List<string>(); 


     foreach(Parent parent in parentCollection){ 
      nameCollection.Add(parent.Name); 
      foreach(Child child in parent.Children) 
       nameCollection.Add(child.Name); 

     } 

    } 
} 


public class Parent 
{ 
    public string Name = string.Empty; 
    public List<Child> Children = new List<Child>(); 
} 
public class Child 
{ 
    public string Name = string.Empty; 
} 

Antwort

3

können Sie Select verwenden, die Unter Sammlungen flacht:

var all = parentCollection.Select(p=>p.Name) 
     .Concat(parentCollection 
        .SelectMany(p=>p.Children).Select(c=>c.Name)); 

Hinweis: Das wird nur mit einer Tiefe von Eltern/Kind-Beziehung arbeiten. Wenn Sie eine echte Rekursion (mehrere Ebenen) haben, müssen Sie einen Iterator implementieren, der rekursiv die Kinder liefert.

Edit: hat die Kinder in der richtigen Reihenfolge, etwas hässlich, das funktioniert:

var all = parentCollection.Select(p=>new {Parent=p.Name, Name = ""}) 
      .Concat(parentCollection.SelectMany(p=>p.Children 
          .Select(c => new {Parent=p.Name, c.Name}))) 
      .OrderBy(o => o.Parent).ThenBy(o => o.Name) 
      .Select(o=> o.Name != "" ? o.Name : o.Parent); 
+0

-Code gut +1 ist. Bemerkung über Rekursion ist seltsam - ich stimme damit nicht überein. –

+0

Ja, ich habe es ein bisschen vermasselt. Ich habe über die Schwierigkeit nachgedacht, "Return Return Foo" zu haben, wo Foo ein Ionomerable ist. Sie müssen einen benutzerdefinierten Iterator durchlaufen, um den übergeordneten Kinderbaum zu durchlaufen, wenn mehrere Ebenen vorhanden sind. –