たにーの楽しい闘争

日々の気になる事を書いていきます

【C#】LINQとラムダ式について

※基礎すぎる記事です

LINQで何ができるか

結論としては、
配列やコレクションの中のデータに対して、
条件を加えて取り出したり、加工したりする事ができます。

例えばこんな感じ。

        static void Main(String[] args) {

            List<int> number = new List<int>();
            number.Add(10);
            number.Add(20);
            number.Add(30);

            //25以上の数字だけ取り出す
            var selectNumber = number.Where(n => n >= 25);

            foreach(var i in selectNumber)
            {
                Console.WriteLine(i);
            }
        }

実行結果

30

LINQをつかっている部分がここです。

var selectNumber = number.Where(n => n >= 25);

因みにLINQを使わなければ、上の1行をこんな長く書かなきゃいけないです。

            List<int> selectnumber = new List<int>();
            for (int i = 0; i < number.Count; i++)
            {
                if(number[i] >= 25)
                {
                    selectnumber.Add(number[i]); 
                }
            }

なのでLINQは積極的に使いたいところですね。
最初はWhere(n => n >= 25)について「何これ?」と思いますが、
これはラムダ式というLINQで条件を指定するための書き方です。
LINQを使うのであれば、まず初めにこのラムダ式を覚える必要があります。

ラムダ式とは

ラムダ式とは、で検索すると色々難しい説明が出てきますが、
最初は戻り値があるメソッドをシンプルに書く方法くらいの理解でいいかと思います。

下記がラムダ式の書式

引数 => 計算式

さっきの例でいうとここがラムダ式です

n => n >= 25

わかりづらいので引数に10を足して返却するメソッドがあったとしましょう。

int Add(int n) 
{
    return n + 10 ;
}

これをラムダ式で書くと下記のようになります。

n => n + 10;

引数が2つの場合はこんな感じで()でくくります

(n,a) => n + a;

条件が複数の場合

先ほどは25以下とデータという限定した条件でした。
複数の条件の場合は、下記で問題ないようです。

        List<int> number = new List<int>();
        number.Add(10);
        number.Add(20);
        number.Add(30);

        //15以下または25以上
        var selectnumber = from n in number
                           where n <= 15 || n >= 25
                           select n;

        foreach (var i in selectnumber)
        {
            Console.WriteLine(i);
        }

実行結果

10
30

LINQのメソッド一覧

主に下記がラムダ式を使う基本的なLINQのメソッドです。

Where 条件を満たす要素をすべて返します
Select 各要素に処理を行って新しいデータを返します
OrderBy 昇順に並べ替えたデータを返します
OrderByDescending 降順に並べ替えたデータを返します
All すべての要素が条件を満たしているか判定します
Any 条件を満たす要素が含まれているか判定します

これはほんの一部で他にもたくさんメソッドが存在するのですが、ご丁寧にサンプルコードも併せて書いてくださっている記事を発見しました。
ありがたい限りです。

yujisoftware.hatenablog.com

最後に

今回はあくまでも前提として入れておく必要がある最低限の知識になりますので、他人が書いたLINQを改修しなければいけなかったり、もっと複雑な式を理解する必要があったりする場合は、これだけでは苦しむと思います。
自分自身理解を深めるためにも、追々LINQの応用編をアップしたいなと思ってます。(余裕があったら)

ではでは