『究極のC#プログラミング』 Chapter7 ラムダ式 後編

式形式のラムダ式と、ステートメント形式のラムダ式

// 式形式
(引数リスト) => 内容

// ステートメント形式
(引数リスト) => { 内容 }

式形式で書けない場合もあるので、ステートメント形式も必要
式形式で書けない原因として、C/C++で存在するカンマ演算子が存在しない点がある。


簡単なif文なら、null合体演算子(??)や条件演算子(?:)で置き換え可能である。
注意点として、条件演算子の第二第三の項にvoidを返すメソッド呼び出しは書けない。

型指定の省略

たいていはラムダ式の引数の型は省略できる


省略できないこともある。
例えば、引数の異なるデリゲート型d1, d2をそれぞれ引数とする、メソッドSampleが2つあるとする。
この時に、Sampleメソッドの呼び出し側で、与えるラムダ式の引数の型を省略するとエラーになる。


varで宣言された変数にラムダ式を代入できない

空のラムダ式

(x) => { }

デリゲート変数の中身がnullである場合も、nullでない場合と同様に扱えるのが利点。

Anyメソッド

コレクションのAnyメソッドは、

Func<int, bool>

なpredicateを渡すことで、指定条件の要素を含むか判別できる。

// "0を含みます"と出力される
            int[] a = { 0, 1, 2 };
            if (a.Any((x) => x == 0))   // ラムダ式を渡す。x => x == 0と書いても同じ
            {
                Console.WriteLine("0を含みます");
            }

ラムダ式内の変数xは、型推論によりint型であると判定される。

Whereメソッド

LINQのWhereメソッドを使うと、指定条件の要素だけ抜き出せる。
戻り値は、列挙子である。

            int[] a = { 0, 1, 2, 3 };
 
           IEnumerable<int> query = a.Where(x => x < 2);

            foreach (int n in query)
            {
                Console.WriteLine(n);
            }
0
1

ラムダ式オーバーロードの解決

デリゲートを引数にとるメソッドの呼び出しにおいて、

() => 123

というラムダ式を渡したとする。

Func<double>

を引数の型とするメソッドと

Func<int>

を引数の型とするメソッドがあったとする(メソッドのオーバーロード)。


このとき、後者のメソッドが呼ばれる。


このように、ラムダ式によって、呼ばれるメソッドが異なることがあるので注意する必要がある。