初めてのLINQ

プログラミングC# 第6版 8.1


LINQです。クエリ式とも言うみたいです。一見すると何がなんだか良くわからない感じに見えますが、今までのC#の知識で十分読み解けそうです。

ということでまずは一番シンプルなクエリ式の構文を見てみましょう。

using System;
using System.Linq;

class Program {
    static void Main() {
        int[] nums = new int[] {
            1,2,3,4,5,6,7,8,9,10
        };
        
        // 偶数だけを得る処理 これがLINQ!
        var ret = from i in nums where i % 2 == 0 select i;
        
        foreach(int i in ret) {
            Console.WriteLine(i);
        }
    }
}
$ main
2
4
6
8
10

クエリ式は必ずfromから始まり、fromの後はforeachに指定するのと同じ様な構文を指定し、whereでif条件を指定し、selectでreturnするものを指定すると言った感じです。

LINQを使わず上記処理を書くならば以下のようになります。

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        int[] nums = new int[] {
            1,2,3,4,5,6,7,8,9,10
        };
        
        // 偶数だけを得る処理
        var ret = new List<int>();
        foreach(var i in nums) {
            if ( i % 2 == 0 ) {
                ret.Add(i);
            }
        }
        
        foreach(int i in ret) {
            Console.WriteLine(i);
        }
    }
}

こうみると、LINQを使うことでかなり処理がスッキリしますね。

ちなみにLINQの構文はC#の通常の言語仕様の処理にも置き換えが可能とのことです。具体的には以下のような処理になります。

using System;
using System.Linq;

class Program {
    static void Main() {
        int[] nums = new int[] {
            1,2,3,4,5,6,7,8,9,10
        };
        
        // 偶数だけを得る処理
        var ret = nums.Where(i => i % 2 == 0).Select(i => i);
        
        foreach(int i in ret) {
            Console.WriteLine(i);
        }
    }
}

int[]に対してWhereメソッドを呼んでますが、これは以前習った拡張メソッドです。

そしてWhereメソッドに渡している引数はラムダ式ですね。

何もややこしくないですね。初めて見たときは複雑怪奇で意味がわかりませんでしたが、上記仕様を理解していれば簡単に読めますね。