2009-03-16 8 views
27

J'ai un objet de type A qui se compose d'une liste d'objets de type B:Linq: Liste des listes à une longue liste

class A { list<B> Alist;} 
class B { string C; string D;} 

Dans mon programme, j'ai une liste de A objets:

list<A> listOfA = computeAList(); 

et je voudrais sélectionner toutes les chaînes C dans cette liste. La déclaration suivante que j'espérais me donnerait le résultat que je voulais; elle retourne une liste de listes contenant les C « s:

var query = from objectA in listOfA 
      select objectA.Alist.FindAll(x => x.C.Length > 0).C; 

Y at-il un moyen d'obtenir une liste unique de tous les C » s au lieu?

Répondre

46

La réponse de ybo aurait été ma première réponse aussi. L'expression de requête équivalente de ceci est:

var query = from a in computeAList() 
      from b in a.Alist 
      select b.C; 

Par souci d'exhaustivité, les autres réponses dans ce fil sont des variations sur le même thème.

De YBO (la même requête exacte, exprimée en notation par points):

var query = listOfA.SelectMany(a => a.Alist, (a, b) => b.C); 

De Ray Hayes (y compris la clause Where, j'ai reformatée légèrement):

var query = listOfA.SelectMany(a => a.AList, (a, b) => b.C) 
        .Where(c => c.Length > 0); 
+0

C'était exactement ce que je cherchais - Merci beaucoup Jon! – Chau

+0

@Jon, désolé, je n'ai pas vu votre commentaire. Maintenant * vous * pouvez inclure la réponse de Ray;). Merci à vous et Ray. – ybo

+0

J'ai été à cette réponse environ 20 fois jusqu'à présent. Je ne sais pas pourquoi je ne peux pas me souvenir de "selectmany" et toujours essayer "selectall", mais ça arrive toujours. Chanceux c'est toujours juste un google loin! – statue

14

Moi aussi aurait eu une réponse similaire, ma seule modification était d'ajouter la clause where pour éviter d'avoir des chaînes vides (où C est vide):

listOfA.SelectMany(a => a.AList, (a, b) => b.C).Where(c => c.Length > 0); 
Questions connexes