C#とLINQで直積集合


C#をかじり始めました。LINQがなかなか面白そうだったので、試しに直積集合を作ってみました。
直積集合とは2つの集合$A, B$から次のように作られる集合です:

\left\{ (a, b) \mid {a \in A} \wedge {b \in B} \right\}

ペアの集合だけではつまらないので、九九表を出力するプログラムにしました:

Test.cs
using System;
using System.Linq;

public class Test
{
    public static void Main()
    {
        var e = Enumerable.Range(1, 9);
        var qq = from n in e from m in e select new {x = n, y = m, z = n*m};
        foreach (var x in qq) Console.WriteLine(x.ToString());
    }
}

fromを2つ重ねています。このクエリ式は下のSelectMany拡張メソッドを使用した式と等価なようです。

Test.cs
using System;
using System.Linq;

public class Test
{
    public static void Main()
    {
        var e = Enumerable.Range(1, 9);
        var qq = e.SelectMany(n => e, (n, m) => new { x = n, y = m, z = n * m });
        foreach (var x in qq) Console.WriteLine(x.ToString());
    }
}

以上。