2009-06-02 6 views
0

Existe-t-il une méthode LINQ pour accomplir cela? Toute aide est grandement appréciée.Fusionner la propriété parent-enfant en utilisant 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; 
} 

Répondre

3

Vous pouvez utiliser SelectMany qui aplatit sous collections:

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

Notez cela ne fonctionne qu'avec une profondeur de la relation parent/enfant. Vous avez une vraie récursion (plusieurs niveaux) vous devez implémenter un itérateur qui donne les enfants récursivement.

Edit: pour avoir les enfants dans le bon ordre, quelque chose de laid qui fonctionne:

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); 
code
+0

est bon +1. Remarque sur la récursivité est bizarre - je ne suis pas d'accord avec ça. –

+0

Oui, je l'ai un peu raté. Je pensais à la difficulté d'avoir "yield return foo" où foo est un ienumerable. Vous devez passer par un itérateur personnalisé pour parcourir l'arborescence des enfants parents s'il y a plusieurs niveaux. –

Questions connexes