LINQの基本
- 連載:C# 3.0入門 第6回 LINQ基礎編 (http://www.atmarkit.co.jp/fdotnet/csharp30/csharp30_06/csharp30_06_02.html)
PythonとC#を比較。ただしクエリ式はコピーでなくビューを表すことに注意。ここで、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.価格 };