2009-03-16 20 views
27

ich ein Objekt vom Typ haben A die B einer Liste von Objekten des Typs besteht:Linq: Liste der Listen zu einer langen Liste

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

In meinem Programm habe ich eine Liste von A Objekte:

list<A> listOfA = computeAList(); 

und ich möchte alle C Strings in dieser Liste auszuwählen. Die folgende Aussage, die ich hoffte, würde mir das gewünschte Ergebnis geben; es gibt eine Liste von Listen, die die C enthält ‚s:

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

Gibt es eine Möglichkeit, eine einzige Liste aller C zu bekommen‘ s statt?

Antwort

46

YBO Antwort wäre meine erste Antwort haben. Die Abfrage Ausdruck Äquivalent davon ist:

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

Aus Gründen der Vollständigkeit, die anderen Antworten in diesem Thread sind Variationen des gleichen Themas.

Von YBO (genau die gleiche Abfrage, ausgedrückt als Punktnotation):

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

Von Ray Hayes (einschließlich der Where-Klausel, ich habe etwas umformatiert):

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

Das war genau das was ich gesucht habe - Vielen Dank Jon! – Chau

+0

@Jon, tut mir leid, ich habe deinen Kommentar nicht gesehen. Jetzt * kannst du * Ray's Antwort einschließen;). Danke euch und Ray. – ybo

+0

Ich war zu dieser Antwort ungefähr 20mal bis jetzt. Ich weiß nicht, warum ich mich nicht an "selectmany" erinnern kann und versuche immer "selectall", aber es passiert immer. Zum Glück ist das immer nur ein Google-Weg entfernt! – statue

14

ich auch hätte eine ähnliche Antwort, meine einzige Änderung war, die where-Klausel hinzuzufügen, um leere Strings zu vermeiden (wobei C leer ist):

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