160

次のLINQステートメントはどのように機能しますか?

これが私のコードです:

var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
    Console.WriteLine(i);
}

出力: 2, 4, 6, 8

なぜ2, 4, 6ですか?

4

5 に答える 5

235

出力は2,4,6,8遅延実行によるものです。

クエリは、クエリ変数が作成されたときではなく、クエリ変数が反復処理されたときに実際に実行されます。これは遅延実行と呼ばれます。

-- Suprotim Agarwal、「LINQ での遅延クエリと即時クエリ実行」

Immediate Query Executionと呼ばれる別の実行があります。これは、クエリ結果のキャッシュに役立ちます。再び Suprotim Agarwal から:

シングルトン値を生成しないクエリの即時実行を強制するには 、クエリまたはクエリ変数でToList(), ToDictionary(), ToArray(), Count(), Average()またはメソッドを呼び出すことができます。Max()これらは変換演算子と呼ばれ、結果のコピー/スナップショットを作成でき、クエリを再実行する必要なく、何度でもアクセスできます。

出力を にしたい場合は、次2,4,6を使用します.ToList()

var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).ToList();
list.Add(8);
foreach (var i in even)
 {
    Console.WriteLine(i);
 }
于 2013-07-17T12:34:03.977 に答える
0

LINQ から取得した IEnumerable<> を使用すると、Enumerator クラスのみが作成され、いくつかのウォークで使用したときにのみ反復が開始されます。

于 2013-07-24T18:49:35.527 に答える
0

この理由は、ラムダ式の遅延実行です。foreach ループで反復処理を開始すると、クエリが実行されます。

于 2013-07-17T19:32:40.903 に答える