転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

C#を勉強する⑥_LINQ to Objects

LINQは「Language Integrated Query」の略。自分が勉強したイメージだと、SQLの構文をC#で使えるイメージ。LINQを使うには、usingディレクティブを使って名前空間System.Linqを指定する。
イメージでSQLと言ったのは、LINQにはクエリ演算子なるものが用意されているから。以下に例を示す。

var names = new List<string> {
                "Tokyo", "New Delhi", "Bangkok", "London", "Paris", "Berlin", "Canberra", "Hong Kong",
            };

// listより、文字列が5以下の要素を抽出
IEnumerable<string> query = names.Where(s => s.Length <= 5);

なお、クエリ演算子は数が多いため、必要に応じて都度調べることにする。

遅延実行

LINQの特徴に、遅延実行がある。これは、本当にデータが必要になったときにクエリが実行されることをさす。

var names = new List<string> {
                "Tokyo", "New Delhi", "Bangkok", "London", "Paris", "Berlin", "Canberra", "Hong Kong",
            };

// listより、文字列が5以下の要素を抽出
IEnumerable<string> query = names.Where(s => s.Length <= 5);

foreach(var item in query) {

    // TokyoとParisが出力
    Console.WriteLine(item);

}

// リストを更新
names[0] = "Osaka";

foreach(var item in query) {

    // OsakaとParisが出力される
    // Tokyoが出力されないのは、このタイミングでWhereメソッドが実行されているため
    Console.WriteLine(item);

}

逆に即時実行をしたい場合は、WhereメソッドとToArrayメソッドをメソッドチェーンでつなぎ、配列に変換してしまえばいい。

var names = new List<string> {
                "Tokyo", "New Delhi", "Bangkok", "London", "Paris", "Berlin", "Canberra", "Hong Kong",
            };

// listより、文字列が5以下の要素を抽出し、配列に変換
IEnumerable<string> query = names.Where(s => s.Length <= 5).ToArray();

foreach(var item in query) {

    // TokyoとParisが出力
    Console.WriteLine(item);

}

// リストを更新
names[0] = "Osaka";

foreach(var item in query) {

    // TokyoとParisが出力される
    Console.WriteLine(item);

}