2016-01-29 11 views
12

のために私はループを持っています。LINQのは、ネストされたループ

LINQ文を探していますが、わかりません。私はそれを試してみました

result = myColl 
    .SelectMany(x => x.MyList) 
    .SelectMany(x => /* how to get the key of the outer loop here */ + x) 
+3

は、読みやすいクエリ構文を好むときです。この場合、なぜlinqを使用する必要があると思いますか? – Loofer

答えて

14

これは、クエリ式で簡単である:

(from x in myColl 
from y in x.MyList 
select x.MyKey + y).ToList() 

これに変換これが機能:キーがである

myColl 
.SelectMany(x => x.MyList.Select(item => new { List = x, Item = item })) 
.Select(x => ...) //rest of the query, whatever you like 

リストとアイテムの両方を保持してください。匿名型(またはその他のコンテナ)を使用してクエリを介してそれらのチャネルを配信します。

+0

匿名のプロパティに名前を付ける必要があります。 –

+0

彼らは式からデフォルト名を得ます。これは動作します。編集していただきありがとうございます。 – usr

+0

2番目の 'SelectMany'は単に' Select'でなければならないと確信しています。あるいは、Tormodの答えで 'SelectMany'オーバーロードに変換する可能性があります。 – juharr

5

「親」要素へのアクセスを許可するoverload of SelectManyがあります。それはこのようになりますあなたの具体的な例

: ListOfList.SelectMany(リスト=> list.InnerList、(LST、要素)=> HandleInnerListAndElementFromIt(LST、要素)

result = myColl.SelectMany(x => x.MyList,(x1,x2)=>DoSomething(x1,x2)); 

EDITを追加しました:SelectManyメソッド呼び出しから2つのラムダのパラメータがあることを

result = myColl.SelectMany(x=>x.MyList,(x,y)=>x.MyKey+y)); 

は注意してください。

最初にlambdaは "x"を取り、新しいEnumerableを返します。 x => x.MyList

2番目のラムダは "x"と "y"をとり、新しい結果を生成します。 (X、Y)=> x.MyKey + Y

+1

私はそれが涼しくて、私が必要とするものを読むのは難しいですが、私は認めなければなりません。 – HimBromBeere

+0

私はそれを見ることができます。私は明確にするために編集しました。がんばろう。 – Tormod

4

私は個人的にLINQクエリは、よりあいまいかもしれ場所ごとの入れ子になった

var result = from x in myCol1 
      from y in x.MyList 
      select x.MyKey + y; 
+0

そう簡単に...私はそれが機能しなければならないことを知っていた。ありがとう:) – HimBromBeere

関連する問題