まるノート

備忘録も兼ねて、様々なお役立ち情報をまとめています。

【C#】LINQについて

はじめに

少し前にラムダ式について記事を書いてみましたが、 さらにC#でよく見かける記述、LINQについての備忘録を記載します。

ラムダ式はデリゲートの引数として、一度しか使わない関数を、以下のようにその場で簡単に書くことができる記法でした。
(int n) => { return (n % 3 == 0); }

上の例だと、=>の左側がint型の引数で、右側はnが3で割り切れる場合にTrueを返すことを表していて、
これを更に簡略化して n => n % 3 == 0 と記載できるといった内容でした。

LINQはこのラムダ式の記法と共通する点があり、そのまま覚えてしまうと頭に入りやすいと思います。


LINQの使い方

とりあえずLINQとはどんなものか活用例を見て頂きたいと思います。

namespace Sample
{
    class LinqTest
    {
        static void Main()
        {
            int[] src = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

            IEnumerable<int> n = src.Select(x => x + 100);
            Console.WriteLine("{0}", string.Join(", ", n));
        }
    }
}


実行結果

100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110


x => x + 100の部分はラムダ式と同じ記法になります。引数xに渡した各配列要素に100を加えてreturnしているわけです。

LINQの主な特徴としては、以下が挙げられます。

  • LINQは配列やリストなどコレクションの要素を処理する。
  • 処理内容をメソッドで指定できる。(上の例だとSelect)
  • LINQの処理で返す型はIEnumerable<各要素の型(上の例だとint)>
  • 記述が簡潔にすむ。

LINQとは何かを簡潔に表すと、ループ処理を簡単に記載するためのメソッドを提供するライブラリです。

Selectメソッドを使うことで、単純に各要素に対する処理結果を取得していることがわかります。(例えば10を渡した結果110が返ってくる。)

Selectの他によく登場するメソッドとしてWhereがあります。 例えば、上の例にあるsrc.Select(x => x + 100)にWhereを追加して、
src.Select(x => x + 100).Where(y => y % 2 == 0)で実行した場合、 実行結果は以下になります。

100, 102, 104, 106, 108, 110


Whereの引数には、y => y % 2 == 0のように通常、真偽値を返す処理を記載します。結果がTrueの要素のみ出力しています。

ここまで見ると、srcの値をxに渡し、更にsrc.Select(x => x + 100)の結果を後続のyに渡しているのがわかるでしょう。

最後に、上記のWhereを使ったLINQをforeachで書き直してみました。同じ内容でも記述量が全然違います。

namespace Sample
{
    class LinqTest
    {
        static void Main()
        {
            int[] src = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            List<int> dst = new List<int>();
            foreach(int i in src)
            {
                int sum = i + 100;
                if(sum % 2 == 0)
                {
                    dst.Add(sum);
                }               
            }

            foreach (int i in dst)
            {
                {
                    Console.WriteLine("{0}", string.Join(", ", i));
                }
            }
        }
    }
}


以上、非常に単純なサンプルを用いてLINQについて触れてみました。
他にも色んなメソッドがありますが、基本的な活用方がわかればある程度は内容がわかるのではないでしょうか。