先日知った話ですが、忘れないようにメモ。
というか、いきなりコードと実行結果。
Console.WriteLine("---------/ q1 /------------");
var q1 =
from y in Enumerable.Range(1, 3)
from x in Enumerable.Range(1, 3)
select String.Format("y = {0} : x = {1}", y, x);
foreach(var i in q1) Console.WriteLine(i);
Console.WriteLine("---------/ q2 /------------");
var q2 =
Enumerable.Range(1, 3).Select(y =>
Enumerable.Range(1, 3).Select(x => String.Format("y = {0} : x = {1}", y, x)));
foreach(var i in q2) Console.WriteLine(i);
Console.WriteLine("---------/ q3 /------------");
var q3 =
Enumerable.Range(1, 3).SelectMany(y =>
Enumerable.Range(1, 3).Select(x => String.Format("y = {0} : x = {1}", y, x)));
foreach(var i in q3) Console.WriteLine(i);
---------/ q1 /------------
y = 1 : x = 1
y = 1 : x = 2
y = 1 : x = 3
y = 2 : x = 1
y = 2 : x = 2
y = 2 : x = 3
y = 3 : x = 1
y = 3 : x = 2
y = 3 : x = 3
---------/ q2 /------------
System.Linq.Enumerable+<SelectIterator>d__d`2[System.Int32,System.String]
System.Linq.Enumerable+<SelectIterator>d__d`2[System.Int32,System.String]
System.Linq.Enumerable+<SelectIterator>d__d`2[System.Int32,System.String]
---------/ q3 /------------
y = 1 : x = 1
y = 1 : x = 2
y = 1 : x = 3
y = 2 : x = 1
y = 2 : x = 2
y = 2 : x = 3
y = 3 : x = 1
y = 3 : x = 2
y = 3 : x = 3
考えてみれば
そりゃそうだよなー
な結果です。
from が 2 つ以上重なるクエリー式をメソッドに書き直す時は、SelectMany を使う点に注意です。