2008-10-15 4 views
3

Désolé, ce titre fait juste mal. Je me demande s'il y a une méthode d'extension LINQ aux collections qui s'effondre le segment de code suivant dans une seule ligne:Existe-t-il une méthode linq-y pour les propriétés de collection d'union d'une collection d'objets?

public IEnumerable<Child> GetAllChildren(IEnumerable<Parent> parents){ 

    var result = new List<Child>(); 

    foreach(Parent parent in parents) 
    foreach(Child child in parent.Children) 
     result.Add(child); 

    return result; 
} 

Si vous pouvez réduire cela en une seule déclaration, essayez de difficulté fou:

public IEnumerable<Child> GetAllChildren(IEnumerable<Grandparent> nanas){ 

    var result = new List<Child>(); 

    foreach(Grandparent papa in nanas) 
    foreach(Parent parent in papa.Children) 
     foreach(Child child in parent.Children) 
     result.Add(child); 

    return result; 
} 

Répondre

7

est ici la forme de la méthode obligatoire.

return parents 
    .SelectMany(p => p.Children); 

Et pour deux niveaux:

return oldies 
    .SelectMany(grand => grand.Children) 
    .SelectMany(parent => parent.Children); 
+0

Je ne sais pas pourquoi je n'ai pas choisi cela comme réponse ... – Will

9

cela fonctionne:

public IEnumerable<Child> GetAllChildren(IEnumerable<Parent> parents) 
{ 
    return from parent in parents 
      from child in parent.Children 
      select child; 
} 

puis ceci:

public IEnumerable<Child> GetAllChildren(IEnumerable<Grandparent> nanas) 
{ 
    return from papa in nanas 
      from parent in papa.Children 
      from child in parent.Children 
      select child; 
} 

Notez que, dans cet exemple, je ne renvoie pas de liste, je renvoie une source de données IEnumerable qui, jusqu'à ce que vous commenciez à foreach dessus, ou similaire, n'effectue aucun traitement.

Si vous avez besoin de retourner une liste, modifier chaque instruction de retour comme suit:

return (from ..... 
      ... 
      select child).ToList(); 
+0

La valeur de retour doit être un IEnumerable, et la meilleure façon (au moins autant que je sache) de le faire est de retour une collection qui implémente IEnumerable . Merci d'avoir répondu! – Will

+0

Vous pouvez retourner une collection, ou utiliser le rendement de rendement, recherchez le mot-clé de rendement sur msdn si vous n'êtes pas familier avec lui. –

+0

Bon point sur le rendement ... D'habitude, je ne fais pas ça dans ce genre de cas à cause d'une étape qui échoue, auquel cas je retourne juste la collection vide. C'est assez évident ce que je fais, alors qu'un rendement parfois n'est pas clair ce qui se passe dans ces cas pour les gens qui viennent derrière moi ... – Will

Questions connexes