2

アイテムのリストがあり、そのリストから述語を満たす 3 つのアイテムを選択したいと考えています。

私はこれを試しました:(例)

list.Where(x => x == 2).Take(3)

list.Take(3).Where(x => x == 2)

しかしもちろん、それらは機能しません。

が満たされるまで、述語を満たす要素のみを選択するメカニズムはあり.Take(3)ますか?

編集:最初の例の問題は、最初に一致するすべての要素を選択し、次に最初の 3 を取得することです。3 を取得するまで選択したいだけです。それは巨大なコレクションでのみ重要だと思いますが、それでも. というか、そのように理解しています。

これが起こります: (編集: 私はこれについて間違っていました)

[1, 2, 2, 2, 3, 4, 5, 2].Where(x => x == 2)=> [2, 2, 2, 2].Take(3)=>[2, 2, 2]

[1, 2, 2, 2, 3, 4, 5, 2].Where(x => x == 2, 3)=>のようなものが必要です [2, 2, 2]。3 は、フィルタリングを停止する前に一致する要素の数です。

4

1 に答える 1

8

あなたは linq の遅延実行を理解していないと思います。あなたの最初のアプローチはまさにあなたが望むことをします:

list.Where(x => x == 2).Take(3)

すべての項目をチェックしますが、述語に一致する 3 つの項目が見つかるまでチェックします。

彼はそれを非常によく説明しているので、私の質問に対する Eric Lipperts の回答を見てください。

これも読む価値があります: http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx

于 2013-10-16T11:08:12.760 に答える