C#のリンク(LINQ)とは?利点と利用例を簡単に解説!

みなさんは、C#のリンク(LINQ)をご存知でしょうか。

プログラミング初心者の方や、他の言語をメインで使用されている方にはなじみが薄いかも知れません。しかしこのLINQは登場から既に10年以上経過しており、C#を選ぶ一つの要因と言えるほどに便利な機能として、多くのプログラマーから支持されています。

この記事では、LINQを使ったプログラミングに慣れ親しめるよう、

LINQとは何か?
簡単なLINQの利用例
LINQの利点

を解説します。

LINQとは何か?

LINQは「統合言語クエリ」(Language INtegrated Query、注1)と呼ばれる、「データ」を扱うための機能です。2007年にリリースされた『Visual Studio 2008』が対応している『.Net Framework 3.0』(ドットネットフレームワーク)より利用できます。

LINQは「SQL」(Structured Query Language、データベース言語)と似た構文でデータを扱えるため、また同じ処理を通常の記述よりも簡便に記述できるため、技術者に高く評価されています。

簡単なLINQの利用例

簡単なLINQの利用例1:糖衣構文を使用する例

簡単な例として、「1~10」の範囲に含まれる偶数を抽出してみましょう。

        var evens = from n in Enumerable.Range(1, 10)
                    where n % 2 == 0
                    select n;

LINQはデータの集合に対して操作を行うための機能ですので、「コレクション」(ICollectionのインスタンス)や「配列」(Arrayのインスタンス)を対象にします。これらは全て「列挙可能型」(IEnumerableのインスタンス)です。

まず注目してほしいのが「Enumerable.Range(1, 10)」です。これは1~10の整数の配列を生成します。

次に注目してほしいのが「from n」という指定です。これは右側の「in」にて指定された全体を、一つ一つ取り出して一時的な変数「n」へ格納していくことを指定しています。

そして取り出したnが「偶数であるか否か」を「where n % 2 == 0」という条件で判定しています。

最終的に「select n」によって要素を射影(※)します。ここでは「n」とのみ指定しているため、整数型の集合がリストアップされます。
※ 射影とは、必要な要素のみを取り出すことです。より具体的な例を後半で扱います。

この時の「from」句や「where」句に「select」句などがLINQの構文です。これはメソッドチェーンによるLINQ呼び出しの「糖衣構文」(とういこうぶん)になっています。

糖衣構文とは、複雑な記述を簡潔に記述するために定義された構文のことであり、これによってSQLと似たような記述が可能になっています。

簡単なLINQの利用例2:メソッドチェーンを使用する例

次にLINQを「メソッドチェーン」で使ってみます。例によって1~10の整数の範囲に含まれる奇数を列挙してみましょう。

        var odds = Enumerable.Range(1, 10)
            .Where(n => n % 2 == 1)
            .Select(n => n);

注目すべき点は「Where」メソッドと「Select」メソッドです。どちらも前のメソッドの戻り値に対して、さらに「.」(ドット演算子)を用いて処理を継続する形で記述されています。

このようなメソッドの戻り値を連続的に処理していくような記述を、メソッドチェーンと言います。

この例では、1~10の整数の要素全体に対して、まず「Where」メソッドがラムダ式で指定された条件に合致するもののみを抽出します。そして、その要素に対して「Select」メソッドで射影し、処理が完了します。

なお、今回のように射影が実質的に不要な場合、メソッドチェーンを用いたLINQでは、「Select」メソッドを省略できます。

しかし、前述の糖衣構文を用いる場合は「select」句は省略できません。

簡単なLINQの利用例3:リストから条件に当てはまる要素を抽出する

さて、次はもっと実用的な例を見てみましょう。
以下のコードは、ある教科のテスト結果です。

        var dict = new Dictionary<string, int> {
           { "山田太郎", 100 },
           { "田中次郎", 30 },
           { "佐藤三津子", 70 },
        };

※ 氏名や点数は架空のものです。

今回は50点未満を赤点として扱い、実際に赤点者を抽出してみましょう。このようなあるデータ群から、特定の条件に当てはまるデータを抽出する際に、LINQは威力を発揮します。

もしもLINQを用いない場合、通常なら以下のような処理を記述することになります。

        var m = new Dictionary<string, int>();
        foreach (var d in dict)
        {
            if(d.Value < 50)
            {
                m.Add(d.Key, d.Value);
            }
        }

これがLINQなら、とても簡潔に記述できます。
これを見れば、LINQがいかに便利な機能なのか直観的に理解できるのではないでしょうか。

        var members = from d in dict
                      where d.Value < 50
                      select d;

簡単なLINQの利用例4:抽出結果を射影する

先ほどの「例3」では、赤点者の名前と点数を扱いました。
しかし、実際に必要なのは「名前だけ」ということもあるでしょう。

LINQを用いない場合、前述のコードは以下のように変更せねばなりません。

しかし、LINQで実装していた場合、必要な修正はほんの少しです。

ここで注目してほしいのが「select d.Key」の部分です。

「select」句は、「where」句によって抽出されたデータを、最終的に整形することができます。これが射影と呼ばれるものです。

なぜLINQでは修正箇所が「select」句だけで済むのかと言えば、それはLINQが型推論機能を利用しているためです。LINQでは「select」句による射影の結果から自動的に型を推論してくれます。

したがって、LINQを用いればデータに合致する「適切な型」を自動で決定してくれるため、プログラマーがいちいち型の記述を修正する必要がないのです。

LINQの利点とは何か?

LINQの利点は大まかに3つあります。

LINQは必要な記述量が少なくて済む
LINQはRDBMSと親和性が高い
LINQは様々なデータの集合を処理できる

LINQの利点1:LINQは必要な記述量が少なくて済む

まずLINQは、同じようなデータ抽出処理を記述する上で、その記述量を減らすことができるという利点があります。これは前述の利用例を見て頂ければ理解できるでしょう。

そのため、後々修正が必要になった場合の「修正コスト」も変わってきます。これはプログラマーとして重要な利点と言えます。

LINQの利点2:LINQはRDBMSと親和性が高い

そしてLINQはRDBMS(リレーショナルデータベース・マネジメントシステム)と連携する際に、とても親和性が高いことも利点と言えます。

今回は解説しませんでしたが、LINQはOrderByによるソートや、Distinctによる重複の除去など、SQLで行える殆どの操作に対応しています。もちろん更新や削除も行えます。

LINQの利点3:LINQは様々な内容を処理できる

またLINQは、ありとあらゆるデータの表現方法に関わらず処理できます。

今回サンプルとして示したのは『LINQ to Object』と呼ばれるもので、C#のコード上の要素を対象にした機能です。

実際には『LINQ to SQL』がRDBMSとのマッピングを、『LINQ to JSON』がJSONデータとのマッピングを、『LINQ to XML』がXML要素とのマッピングを…、といった具合に、様々な内容を処理できます。

処理するターゲットは違いますが、LINQは同じ構文で処理できます。そのため、一度覚えてしまえば色々なことに応用が利くというわけです。

おわりに

C#は比較的後発に誕生したプログラミング言語です。そのためLINQや型推論、ラムダ式など多くの革新的な機能が搭載されています。

ただそれは言い換えれば、私たちプログラマーのスキル次第であると言うことです。

今回の記事が、C#のなかでも特に便利なLINQについて、知識を深めるきっかけになれば幸いです。




エンジニア募集中

株式会社キャパでは中途エンジニアの募集をしています。
私たちと一緒に働きませんか?
募集概要について詳しくは


◆参考文献
*注1
https://docs.microsoft.com/ja-jp/dotnet/standard/using-linq

関連記事一覧