C# デリゲートとラムダ式【モダンコード】:C#におけるLINQの基礎知識

前回までにデリゲートから匿名メソッドを経由してPredicate、Action、Funcと学んできました。今回からはそれらを活用した「LINQ」という技術を学んでいきます。ここではLINQの基礎知識から紹介していきます。

今回の連載のテーマが「ゼロから学ぶラムダ式」ということで、LINQの基本を理解できれば十分だと思っています。ここが最後の頑張りどころになりますので、あなた自身のペースで学習にチャレンジしてください。

C#におけるLINQ

そもそもLINQとは何でしょうか。Microsoftの公式ホームページでは以下のように解説されています。

統合言語クエリ (LINQ) は、C# 言語への直接的なクエリ機能の統合に基づくテクノロジのセットの名前です。・・・(中略)・・・クエリを記述する開発者にとって、最も目立つ LINQ の “統合言語” 部分は、クエリ式です。 クエリ式は、宣言型の “クエリ構文” で記述されます。 クエリ構文を使用することで、フィルター処理、並べ替え、グループ化などのデータ ソースに対する操作を、最小限のコードで実行できます。

この説明では分かりづらいですが、「クエリを使用する」くらいは読み取れるかなと思います。あまり深く考えすぎると分からなくなってしまうので、ここでは「foreach」の強化版とでも思っておくのがベストです。

LINQのメソッド構文

LINQにはコレクションを扱う際に2つの構文を使用して、コレクションに対する操作を記述することが可能です。それは以下の構文になります。

  • クエリ構文
  • メソッド構文

クエリ構文はSQLライクにコレクションへの操作を記述できる構文ですが、デリゲートやラムダ式を使用した記述方法とは異なりますので、この連載では「メソッド構文」での扱い方を紹介します。

メソッド構文とはメソッドをチェーンしていき、処理を連続して記述する方法です。これまでに以下のような記述方法を見たことのある人は多いと思います。

var afterLinq = list
                .Where(x => x > 10)
                .OrderBy(x => x)
                .Select(x => x);

上記のような形式でメソッドを繋いでいき(チェーン)、処理を記述していくやり方です。C#を普段から書く場合はコチラのほうがなじみがあると思います。

LINQの前提知識

LINQを理解するにはいくつかの前提知識があると望ましいです。それは、これまで学んできた「デリゲート」「匿名メソッド」「Predicate・Action・Func」、そして「型推論」になります。

「デリゲート」「匿名メソッド」「Predicate・Action・Func」については、当連載にて解説してきたので説明を加える必要はないかと思います。内容の理解が完璧でない場合は、「C# デリゲートとラムダ式【モダンコード】のページ」を参考にして、もう一度学びなおしてもよいかもしれません。

「型推論」はC#で協力にサポートされている機能であり、右辺と左辺があった場合に右辺の値から左辺の型を自動で決めてくれる機能になります。この機能が優秀であるため、C#は割と楽に記述することができます。

LINQはこれらの機能を使って記述することになります。これらの機能が分かっていることが前提になるのかなと思います。

LINQで便利な「匿名クラス」

これまで学習してこなかった内容で、LINQを使用するうえで知っておくと便利な機能な「匿名クラス」というものがあります。ここでは簡単に「匿名クラス」について触れておきたいと思います。

「匿名クラス」は「class」キーワードを使用することなくクラスを宣言することができる記述方法です。クラスを使用するときにクラス名を指定できないことから「匿名クラス」と呼ばれています。

以下のサンプルでは匿名クラスを使用しています。見てわかる通りプロパティなども自由に指定できるので、メソッド構文で作成した匿名メソッドを次のメソッドで使用するときに便利です。以下にサンプルアプリケーションを紹介します。

using System;

namespace App13
{
    class Program
    {
        static void Main(string[] args)
        {
            //匿名クラスを作成する
            var list = new[]
            {
                new { Name = "犬" },
                new { Name = "猫" },
                new { Name = "亀" },
            };

            //要素を抽出して表示する
            foreach(var item in list)
            {
                Console.WriteLine(item.Name);
            }

            Console.ReadLine();
        }
    }
}

上記の中で匿名クラスは以下の箇所になります。「new { … } 」で記述する匿名クラスを使用すると便利になる場面がLINQにはありますので、是非とも覚えておいたほうが良いです。

new { Name = "犬" },

以上がLINQを使用するうえで知っておきたい前提知識となります。これまでに解説した内容でLINQを使用することができますが、「型推論」や「匿名クラス」などの新しい概念も紹介しました。

次回からはこれらを使用して代表的なLINQの機能を見ていきたいと思います。LINQを使いこなすことができれば、よりシンプルにソースコードを記述できるので、よりモダンなC#の書き方をすることができるようになります。