[C#] ラムダ式はこれさえ見ればOK!簡単徹底解説

C#

こんにちは、リバティエンジニア[?]たくやです。

現役エンジニアとしてアプリケーション開発やWeb制作、SEOやブログ運営をしています。

C#を勉強していると、ほとんどの方が詰まってしまう場所といえば、「ラムダ式」がかなり上位にランクインすると思います。

理由としては、ラムダ式だけ考え方が少し違っていて、頭の使い方が異なるんです。
なので、混乱してしまう方が多いように思いますし、実際に私もそのうちの1人でした。

今回はそんなラムダ式について、わかりやすく解説していこうと思います。

ラムダ式とは?

まずはそもそも、「ラムダ式」とは何なのかを見ていきましょう!

var result = list.Select( n => 0 < n );
こんな記述を見たことはありますか?
C#に慣れていない方だと、「=>」この部分。なんだこれ?となる方が多いと思います。
この部分が「ラムダ式」と呼ばれる記述になります。
具体的になにかを説明する前に、まずは「delegate(デリゲート)」を理解している必要があります。
なので、まずはデリゲートについて軽く説明しますね。

C# delegate(デリゲート)とは?

delegate(デリゲート)を簡単に説明すると、関数を変数のように扱う為のものなんです。

IT博士
IT博士

もし、関数を変数のように扱えれば、関数の引数に関数を渡す事ができますよ。

関数の引数に関数を渡せる?

それってつまりなんのためですか?

IT博士
IT博士

もし、引数に関数が渡せれば、計算式の一部だけを簡単に差し替える事が可能になるので、より汎用性がでてきますよ。

このデリゲートについては、今回は深く説明しないので、知りたい方は紹介している記事があるので、是非参考にしてみてください!

C# 世界一わかるデリゲート(delegate)について
今回はC#における「デリゲート」について学習していきましょう!「デリゲート」と聞くと、「難しい。」や「今まで何となくで乗り越えてきた。」という方が意外と多くいるのではないでしょうか?そんな難し...

delegateのサンプルコード

// デリゲート宣言
public delegate bool TestDelegate(int n);

// クラス宣言
public class TestList : List<int>
{
    public TestList Select(TestDelegate func)
    {
        var list = new TestList();
        foreach (var obj in this)
        {
            if (func(obj))
            {
                list.Add(obj);
            }
        }
        return list;
    }
}

上記は、List<T>を継承したクラスで、条件に合う項目だけを抜き出すことができる、「Selectメソッド」を作りました。この「条件に合う」という部分にdelegateを使っています。

では早速このクラスを使ったサンプルを見ていきましょう。

// クラスのインスタンス
var list = new TestList();
list.Add(0);
list.Add(1);
list.Add(2);

var result = list.Select(
    delegate (int n)
    {
        if (0 < n)
        {
            return true;
        }
        else
        {
            return false;
        }
    });

このように、匿名メソッドを記述して、値が0以上の項目を抜き出しています。

匿名メソッドについては、わかりやすくまとめている記事があるので参考にしてみてください。

C#2.0 で追加された「匿名メソッド」とは?
匿名メソッドとは? 今回はC#における、匿名メソッドについてお話します。C# 2.0 より前のバージョンの時には、デリゲートを宣言する際には、名前付きのメソッドを使用する方法しかありませんでし...

デリゲートや匿名メソッドについて理解で来たところで、ラムダ式についてみていきましょう!

ラムダ式とは匿名メソッドを簡単にしたもの

簡単に説明すると、ラムダ式とは「匿名メソッドを簡単にしたもの」なんです。

例えば、先ほどデリゲートを説明したコードでラムダ式を使い簡単に記述してみましょう。

var list = new TestList();
list.Add(0);
list.Add(1);
list.Add(2);

var result = list.Select(
    delegate (int n)
    {
    return (0 < n);
    });

このように記述されているものを、delegateが記述されている部分を[ => ]に置き換えたものがラムダ式と呼ばれるものです。

var result = list.Select(
    (int n) =>
    {
        return (0 < n);
    });

これだけでも結構省略されてきましたが、もっと省略する方法があります。

C#には型推論という機構があるのですが、この型推論機構を利用することでラムダ式は、引数の型の記述を省略する事ができます。

var result = list.Select(
    (n) =>
    {
        return 0 < n;
    });

さらに、関数の中身が1行の場合、{}もreturnも省略する事ができます。

// 関数の中身が1行なので{}とreturnを省略
var result = list.Select((n) => 0 < n);

また、もしdelegateの引数が1つだけの場合は()も省略する事ができます。

// delegateの引数が1つだけの場合は()も省略できる
var result = list.Select(n => 0 < n);

ラムダ式を使った記述[Before, After]

var list = new TestList();
list.Add(0);
list.Add(1);
list.Add(2);

var result = list.Select(
    delegate (int n)
    {
        return (0 < n);
    });

この記述がラムダ式を使って省略すると、、、

var result = list.Select(n => 0 < n);

たった1行になってしまうんです。

まとめ

今回は、C#で勉強していく中でほとんどの方が躓くほど、戸惑ってしまう「ラムダ式」についてみていきました。

このラムダ式を理解するには、delegate(デリゲート)匿名メソッドについての基礎知識が必要になります。
それぞれの解説もしているのでよかったら参考にしてみてくださいね!

C# 世界一わかるデリゲート(delegate)について
今回はC#における「デリゲート」について学習していきましょう!「デリゲート」と聞くと、「難しい。」や「今まで何となくで乗り越えてきた。」という方が意外と多くいるのではないでしょうか?そんな難し...
C#2.0 で追加された「匿名メソッド」とは?
匿名メソッドとは? 今回はC#における、匿名メソッドについてお話します。C# 2.0 より前のバージョンの時には、デリゲートを宣言する際には、名前付きのメソッドを使用する方法しかありませんでし...

なにか質問があればお問い合わせフォームでお気軽にお問合せください。
可能な限りすぐにお返事します。
一流プログラマを目指して頑張りましょう!

コメント