LINQは遅延実行
プログラミングC# 第6版 8.2.3
クエリ式で得た値は、実際にforeach等でループするまではまだ実行されてない状態とのこと。
というわけで動作確認。
using System; using System.Linq; using System.Collections.Generic; class Program { static IEnumerable<int> Nums () { for(int i=1; i<11;i++ ) { Console.WriteLine(i); yield return i; } } static void Main() { Console.WriteLine("LINQ start"); var ret = from i in Nums() where i % 2 == 0 select i; Console.WriteLine("LINQ end"); foreach(int i in ret) { } } }
$ main LINQ start LINQ end 1 2 3 4 5 6 7 8 9 10
実行結果を見てわかるとおり、クエリ式終了時点ではまだ反復処理が実行されていない。実際にretをループさせたときに処理が実行されている。