ラムダ式とは
C#3.0で導入されたデリゲート(delegate)や、メソッド・ベースのLINQ文を簡単に記述するためのもの。
(参考:デリゲートについて)
[デリゲート再入門][link-1]
[link-1]:https://atmarkit.itmedia.co.jp/fdotnet/onepoint/onepoint03/onepoint03_01.html
今ではだいぶ浸透してきていると思いますが、
初めて見た時は正直わけがわからなかったです(笑)
以下はラムダ式の冗長な書き方から始めて、
最も簡潔な書き方に変更していく様子です。
###①STEP0(冗長なコード)
judge変数の右辺がラムダ式と呼ばれているもの。
(ラムダ式は一種のメソッド)
C#2.0の時のdelegateの代わりに =>(ラムダ演算子)
が使われています。
=>の左側が引数宣言している箇所。
こちらでは式がjudge変数に代入されるだけで{}内の処理が実行されるわけではありません。
Predicate<int> judge = (int n) =>
{
if (n % 2 == 0)
return true;
else
return false;
};
var count = Count(numbers,judge);
###②STEP1
変数judgeは、代入後すぐにCountの引数に渡してしまうため、judge変数をCountの引数にします。
var count = Count(numbers,
(int n) => {
if (n % 2 == 0)
return true;
else
return false;
}
);
###③STEP2
次の2点から、if文をなくすことができます。
1.returnの右側には、式を書くことができる。
2."n % 2 == 0"は式であり、boolean型の値を持つ。
var count = Count(numbers, (int n) => { return n % 2 == 0; });
###④STEP3
式の{}の中が1つの場合は{}とreturnを省略できる。
var count = Count(numbers, (int n) => n % 2 == 0);
###⑤STEP4
ラムダ式では引数の型を省略できます。
(コンパイラが型を正しく推論してくれるため)
var count = Count(numbers, (n) => n % 2 == 0);
###⑥STEP5
引数が1つの場合、()を省略することができます。
var count = Count(numbers, n => n % 2 == 0);
よく見かけるラムダ式の形になりました。
ラムダ式を使った例
ラムダ式は「どうやるか(HOW)」ではなく、「何をやるか(WHAT)」の視点で、コードを書けるようになりました。
・奇数の数をカウントする。
var count = Count(numbers, n => n % 2 == 1);
・5以上の数をカウントする。
var count = Count(numbers, n => n >= 5);
・数字の1が含まれている数をカウントする。
var count = Count(numbers, n => n.ToString().Contains('1'));
参考文献
この記事は以下の書籍を参考にして執筆しました。
実戦で役立つ
C#プログラミングのイディオム/定石&パターン