LINQの基本

PythonC#を比較。ただしクエリ式はコピーでなくビューを表すことに注意。ここで、C#は、以下のようにスタブの欄にコードを記述したものとする。

using System;
using System.Linq;

public class Program
{
    static void Main() {
        // スタブ 
    }
}
  • まずは基本。
>>> [x for x in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
var query = from x in Enumerable.Range(0, 10) select x;
foreach (int x in query) Console.Write(x + " ");
// 出力:
// 0 1 2 3 4 5 6 7 8 9 
  • 次に、条件で絞り込み。
>>> [x for x in [1,2,3] if x%2 == 1]
[1, 3]
int[] array = { 1, 2, 3 };
var query = from x in array where x % 2 == 1 select x;
foreach (int n in query) Console.Write(n + " ");
// 出力:
// 1 3
  • 次に、ソート処理。
>>> array = [-2,-1,0,1,2]
>>> sorted([x for x in array], key=abs, reverse=True)
[-2, 2, -1, 1, 0]
int[] array = { -2, -1, 0, 1, 2 };
var query = from x in array
                orderby Math.Abs(x) descending select x;
foreach (int n in query) Console.Write(n + " ");
// 出力:
// -2 2 -1 1 0 

複数条件を指定可能。

var query = from x in array
                orderby Math.Abs(x) descending, x descending select x; 
foreach (int n in query) Console.Write(n + " ");
// 出力:
// 2 -2 1 -1 0 
  • 次に、2つのループをつなげる処理。
>>> [m for m in [n*n for n in range(1,11)] if m>50]
[64, 81, 100]
var query = from n in Enumerable.Range(1,10)
                select n * n into m where m > 50 select m;
  • 次に、グルーピング。
>> import itertools
>>> class Foo:
...     def __init__(self, str, n):
...         self.str, self.n = str, n
...
>>> L = [Foo('a',1), Foo('a',2), Foo('b',3), Foo('c',4)]
>>> grps = itertools.groupby(L, lambda f: f.str)
>>> for k, g in grps:
...     print 'str=%s' % k
...     print ' ' + ' '.join([str(f.n) for f in g])
...
str=a
 1 2
str=b
 3
str=c
 4
Foo[] L = {
    new Foo() {str="a",n=1},
    new Foo() {str="a",n=2},
    new Foo() {str="b",n=3},
    new Foo() {str="c",n=4},
};
var query = from n in L group n by n.str;
foreach (IGrouping<string, Foo> r in query)
{
    Console.WriteLine("str={0}", r.Key);
    foreach (Foo p in r) Console.Write(" {0}", p.n);
    Console.WriteLine();
}
// 出力:
// str=a
//  1 2
// str=b
//  3
// str=c
//  4
  • 最後は、join句。
# Python版は省略

from句を使用したやり方。

var query = from x in 商品情報データ
            from y in 商品販売価格データ
                where x.Id == y.Id
                select new { Name = x.名前, Price = y.価格 };

同じことをjoin句を利用したやり方。

var query = from x in 商品情報データ
            join y in 商品販売価格データ on x.Id equals y.Id
                select new { Name = x.名前, Price = y.価格 };