佐々木屋

技術的なことから趣味まで色々書きます

ラムダ式の基本

LINQの話をする前にラムダ式を説明しておきます。

ラムダ式(lambda expression)自体は関数型言語で良く使われる機能の一つですが、デリゲートやLINQを利用した際のメソッド引数部分をより簡潔に記述できるようにとC#3.0(VB.NET9)から導入されました。

ラムダ式の構文は以下の通り、式形式と文形式の2種類があります。

//式形式
左辺 => 右辺

//文形式
左辺 => {
            右辺
        };
'式形式
Sub(左辺) 右辺
Function(左辺) 右辺

'文形式
Sub(左辺)
    左辺
End Sub
Function(左辺)
    左辺
End Function



式形式は短くまとめやすいので、簡単な処理であればこちらの方が優位です。逆に複数行の少し複雑な処理をする場合は文形式の方がよいでしょう。

多分例を見ないとピンとこないので、適当な例を挙げてみましょう。例えば以下のような数値配列の各要素に2を掛ける処理を考えてみます。

int[] values = { 1, 2, 3, 4, 5 };

{
int res = 0;
foreach (int v in values) {
    res += v * 2;
}
Console.WriteLine(res);
}
Dim values As Integer() = {1, 2, 3, 4, 5}

Dim res As Integer = 0
For Each v As Integer In values
    res += v * 2
Next
Console.WriteLine(res)

普通に書いたらこうなりますよね。

今回はLINQを用いたラムダ式を例とします。集計メソッドsumを利用します。sumは各要素の合計値を計算してくれるメソッドです。

C#の場合、ラムダ式が導入される前は匿名メソッドが利用されていましたので、併せて比較してみましょう。

//匿名メソッド
int res = values.Sum(delegate (int v) 
            {
                return v * 2;
            });
Console.WriteLine(res);

//ラムダ式
int res = values.Sum(v => v * 2);
Console.WriteLine(res);

匿名メソッドを利用したことで、foreachのループ処理が無くなりました。これでもかなりシンプルになりましたが、やはりデリゲートメソッドの部分が少しややこしいのが気になります。ラムダ式はこういった煩わしさから解放するために導入されました。

ポイントはreturnと{}が無くなり、シンプルになったことです。


VB.NETは匿名メソッドが存在しません。C#と異なり、Sub、Functionキーワードが必要になりますので、少し冗長になります。

Dim res As Integer = values.Sum(Function(v) v * 2)
Console.WriteLine(res)

それでもFor Each文が無くなることで非常に読みやすくなります。