LINQとラムダ式について

2019年11月3日

LINQとラムダ式

LINQは、C#3.0ので導入された仕組みで、配列やコレクションに格納されているデータを簡単に整理することが出来ます。例えば、配列中のデータから特定の条件を満たすデータを取り出したり、配列中のデータ1つに対して処理を施したり、複雑になる処理をLINQを使うことで数行で記述できます。
LINQを使うためには処理条件などを記述するためにラムダ式と呼ばれる式を使います。

ラムダ式とは

ラムダ式は、簡単に言うと「戻り値を返す短いメソッドをより簡単に記述する方法」です。
ラムダ式の記述方法にはいくつかありますが、今回はLINQでよく利用される書き方を紹介します。

引数が1つのメソッド

どのようにしてラムダ式が作られるのかを例を用いて説明します。
例えば次のように、引数に5を足して返すAddメソッドがあったとします。

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

このメソッドと同じ動作をするラムダ式を書くと

n => n + 5

となります。

通常のメソッドをラムダ式に変換するには、以下のような書式で記述します。

(引数) => 戻り地の計算式
※引数が1つだけの場合は左辺の()は省略可能

引数が2つのメソッド

次に引数が2つの例を見てみましょう。
2つの引数の合計値を戻り値として返すメソッドです。

int Add(int n){
    return a + b;
}

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

(a,b) => a +b

引数が2つ以上の場合は左辺の引数をカンマで繋いで括弧で囲む必要があります。
引数が0個の場合でも括弧が必要です。

int型以外の戻り値を持つメソッド

戻り値の型はどの型でも指定できます。
次の例は引数の値が0以上ならTrue、それ以外ばFalseを返すメソッド。

bool IsPositive(int n){
    return n >= 0;
}

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

n => n >=0

ラムダ式まとめ

ラムダ式を使うことで戻り値を返す短いメソッドを簡潔に記述できる

LINQとは

LINQとは、「Language INtegrate Querry」の略称で、統合言語クエリと訳されます。
LINQを使うことで配列やコレクションの中から条件を満たす値だけを取り出したり、各データに特定の処理をしたり出来ます。このときのデータを取り出す条件や処理内容を指定するためにラムダ式を利用します。

配列の中から特定の値以上の値だけを取得する

配列の中から500以上の要素だけを取得する処理をLINQで記述します。

int [] array = {420, 120, 600, 0, 1200};

var newArray = array.Where(n => n >=500);

foreach(int n in newArray)
{
    Console.WriteLine(n);
}

Whereメソッド

上記の例では、LINQのWhereメソッドを利用しています。
Whereメソッドは、引数に指定したラムダ式の条件がTrueになるものだけを取り出すメソッドです。

Whereメソッドで作られたデータは戻り値として取得でき、その際の戻り値のデータ型はvar型となります。

形式

変数名.Where(ラムダ式)

配列の要素の値を100ずつ減らすLINQ

int [] array = {550, 420, 600, 800, 220};

var newArray = array.Select(n => n - 100);

foreach(int n in newArray)
{
    Console.WriteLine(n);
}

Selectメソッド

Selectメソッドは、配列またはコレクションの要素を1つずつ取り出して引数に指定したラムダ式の処理を加えます。

形式

変数名.Select(ラムダ式)

配列の中から0の要素を数えるLINQ

int [] array = {550, 0, 600, 0, 220};

int num = array.Where(n => n == 0).Count();

Console.WriteLine(num);

Countメソッド

Countメソッドは、要素数を取得するメソッドです。
上記の例ではWhereメソッドの結果に対してCountメソッドで要素数を数えています。

形式

変数名.Count()

LINQメソッドの代表的なメソッド

メソッド名 役割
Where(ラムダ式) 条件を満たす要素を全て返す
Select(ラムダ式) 各要素に処理を施して新しいデータを返す
OrderBy(ラムダ式) 昇順にソートしたデータを返す
OrderByDescending(ラムダ式) 降順にソートしたデータを返す
Distinct() 重複を除いたデータを返す
Max() 最大値を返す
Min() 最小値を返す
Average() 平均値を返す
Count() 要素数を返す
All(ラムダ式) 全ての要素が条件を満たすかどうか判定する
Any(ラムダ式) 条件を満たす要素が含まれるかどうかを判定する

参考元

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

確かな力が身につくC#「超」入門
価格:2838円(税込、送料別) (2019/10/21時点)

C#, 技術

Posted by kiyo-tomo