2009-03-16 13 views
27

Linq:リストの長いリストへのリスト

私は B型のオブジェクトのリストからなる A型のオブジェクトを持っています:

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

私のプログラムでは、Aオブジェクトのリストがあります:

list<A> listOfA = computeAList(); 

そのリスト内のすべてのC文字列を選択します。私が望む次の声明は、私が望む結果を私に与えるだろう。それはCを含んでいるリストのリストを返します:

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

代わりにすべてのCの単一のリストを取得する方法はありますか?

答えて

46

yboの回答は私の最初の応答でもありました。このクエリ式と同等です:完全を期すために

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

、このスレッド内の他の回答には、同じテーマのバリエーションです。 YBOから

(まったく同じクエリ、ドット表記として表される):

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

(Where句を含む、私はわずかに再フォーマットされてきた)レイヘイズより:

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

それはまさに私が探していたものでした - ありがとうJon! – Chau

+0

@ジョン、申し訳ありませんあなたのコメントが表示されませんでした。今あなたはレイの答えを入れることができます。あなたとRayの両方に感謝します。 – ybo

+0

私はこれまでに約20回この答えに行ってきました。なぜ私は "selectmany"を覚えていないのか分からず、いつも "selectall"を試してみるが、それはいつも起こる。ラッキーこれは常にちょうど1つのGoogleです! – statue

14

私はあまりにも私の唯一の変更は空文字列(Cが空の場合)を避けるためにwhere句を追加することでした。(Cが空の場合)

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