次の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
ですか?
出力は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);
}
LINQ から取得した IEnumerable<> を使用すると、Enumerator クラスのみが作成され、いくつかのウォークで使用したときにのみ反復が開始されます。
この理由は、ラムダ式の遅延実行です。foreach ループで反復処理を開始すると、クエリが実行されます。