4

a) 次の 2 つのクエリは同じ結果を生成しますか?

  var query1 = collection_1
            .SelectMany(c_1 => c_1.collection_2)
            .SelectMany(c_2 => c_2.collection_3)
            .Select(c_3 => c_3);

  var query2 = collection_1
            .SelectMany(c_1 => c_1.collection_2
            .SelectMany(c_2 => c_2.collection_3.Select(c_3 => c_3)));

b) 2 つのクエリを常に同じ意味で使用できるとは限らないと思いますか? たとえば、出力要素に と の値も含めたい場合は、c_1c_2のみ実現できますがquery2、 では実現できませんquery1

  var query2 = collection_1
            .SelectMany(c_1 => c_1.collection_2
            .SelectMany(c_2 => c_2.collection_3.Select(c_3 => new { c_1, c_2, c_3 } )));

?

ありがとうございました

4

2 に答える 2

1

あなたが提供したスニペットは無効のようです。c_3ステートメントのスコープで定義されていないSelectため、何か誤解していない限り、これはコンパイルされません。

の要素を選択しようとしているように見えますがcollection_3、これは によって暗黙的に行われるSelectManyため、どちらの場合も最後のSelectステートメントは冗長です。それらを取り出すと、2 つのクエリは同等になります。

必要なのはこれだけです:

var query = collection_1
           .SelectMany(c_1 => c_1.collection_2)
           .SelectMany(c_2 => c_2.collection_3);

Update: x => xは ID マッピングであるためSelect(x => x)、コンテキストに関係なく常に冗長です。「シーケンス内のすべての要素について、要素を選択する」ことを意味します。

2 番目のスニペットはもちろん異なります。3 つの要素 、 、をすべて選択するには、 SelectManyandSelectステートメントを実際にネストする必要があります。c_1c_2c_3

ただし、Gert のように、おそらくクエリ内包構文を使用した方がよいでしょう。これははるかに簡潔で、クエリの動作を頭の中で簡単に解析できます。

于 2012-10-22T19:03:41.643 に答える
1

を。どちらの場合も、すべてc_3が in c_1throughになるため、クエリは同じですc_2

b. あなたが提案するように、これらのクエリc_1にアクセスすることはできません。c_2必要な場合は、このオーバーロードが必要ですSelectMany。ただし、この「流れるような」構文は非常に扱いにくいものです。これは通常、同じことを行う包括的な構文がはるかに優れている場合です。

from c_1 in colection_1
from c_2 in c_1.collection_2
from c_3 in c_2.collection_3
select new { c_1.x, c_2.y, c_3.z }
于 2012-10-22T19:18:26.160 に答える