次の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
?
次の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でのクエリ実行の遅延vs即時」
即時クエリ実行と呼ばれる別の実行があり、クエリ結果のキャッシュに役立ちます。Suprotim Agarwalから再び:
シングルトン値を生成しないクエリを即座に実行 するには、クエリまたはクエリ変数で
ToList(), ToDictionary(), ToArray(), Count(), Average()
orMax()
メソッドを呼び出します。これらは変換演算子と呼ばれ、結果のコピー/スナップショットを作成でき、クエリを再実行する必要なく、必要な回数だけアクセスできます。
出力をにしたい場合は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);
}
.First()
、.FirstOrDefault()
、.Single()
と.SingleOrDefault()
、クエリの評価をトリガーします。
これは実行の遅延が原因で発生しました。つまり、式の計算は、どこかで必要になるまで実行されません。これにより、データが大きすぎる場合のパフォーマンスが向上します。
延期された実行のため、この結果が得られます。つまり、結果は最初にアクセスされるまで実際には評価されません。
より明確にするために、スニペットの最後にあるリストに10を追加してからもう一度印刷するだけで、出力に10は表示されません。
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);
}
//new*
list.Add(10);
foreach (var i in even)
{
Console.WriteLine(i);
}
10
出力を取得します。
8
、どちらの出力にも含まれなくなります。