「ラムダ式の書き方わからん・・・むむむ」
だった人も、
「なんかよくわからないけど、
.Where( x => ...)
とか書いて、...のところに条件書くと
foreachとか綺麗に書けちゃったりするよねー」
というところまでついてきてくれていると信じて話を続けましょう。
今回、C#の入門書でラムダ式という章が出てきたら
最初に書いてあってわけがわらかないところを(ついに)解説します。
でも、ここまで来て少し体に馴染んできた人に対して、
抑えて欲しいのは一つだけです。
ラムダ式には、単文と複文の二つの書き方がある。まぁ、迷うとしたらこれくらいです。もう山場は越えています。
安心して進みましょう。
思い出して下さい。
intのコレクションがあった場合、それに「.Where」とつけると、
その引数はFunc<int, bool>でした。
そして、Func<int, bool>は、デリゲートでしたね。
Func<int, bool>デリゲートってなんだっけって言うと、
引数intで戻り値boolの関数を格納する変数のようなものでした。
とどのつまり、
Whereには、引数intで戻り値boolのメソッドを食わせる
ということになります。
ところがどっこい、「引数intで戻り値boolのメソッドを食わせる」
という場面で、「x => ...」というラムダ式を食わせてきたわけです。
ということは、「x => ...」というラムダ式は、「引数intで戻り値boolのメソッド」
表現していなければ辻褄があいません。
というわけで、それを表しています。
要するにラムダ式はただのメソッドです、恐れるに足りません。
private bool MyLamda1(int x)
{
return 20 < x;
}
これを、わざわざ外部メソッドで書かずに、その場で記述したのが、
x => 20 < x
です。
実際、外部メソッドとして定義して.Where(MyLamda1)
と書くこともできたりします。
でも、「これだけのためにメソッド一つ定義するか!?」
ってとこにラムダ式の存在意義があります。
さて、さらっと通り過ぎましたが、
x => 20 < x
というこれは、単文に分類されます。
単文とは、外部メソッドで定義した場合の
「return ・・・」の「・・・」の部分だけ抽出して記述するパターンです。
MyLamda1の「return 20 < x;」だけ抽出して書いたら、
「x => 20 < x」となるわけです。
じゃあ、複文って言っているのは何かっていうと、
ラムダ式で表したいメソッドが、
private bool MyLamda2(int x)
{
int dummy = x;
return 20 < dummy;
}
みたいに、「return・・・」だけでは終わらない場合。
(例でdummyに代入する意味はありませんが、
まぁそんなこんなで、「return・・・」だけじゃ書けないよ!
って場面があるのは容易に想像できると思います)
この場合のラムダ式はこうなります。
x =>
{
int dummy = x;
return 20 < dummy;
}
x =>の後に、
{}を書けば自由にメソッドそのものみたいに色々書けて便利。
単文と違って、最後はreturnで締めるよって、いうのが複文。この
「単文では、returnいらないけど、
複文ではreturnがいるよ」
ってところがかなり最初は混乱するのだけれど、
慣れたら便利ですよ、はい。
LINQラムダ式入門は、これで以上です。
引数が二つになったら (x, y) =>だ、とか細かいことを色々言いだすと
切りがないので言いません。
ここまで来れたら、後は自分で進んでいけると思っています。
私はそうだったので多分皆様もそうでしょう。
LINQとラムダ式は、かなり最初のハードルが高かったと感じたので、
これらの記事で少しでも最初のハードルを越える助けができれば、
まとめた甲斐があったかなと思う次第です。
感想や苦情やその他色々あればコメント下さい。
誰も、この記事読んだところで、
多分、リンクから本は買ってくれないと思うので、
せめて誰かの役に立った感が欲しいとか
もう当初の目的は逸脱して終了します(笑)
C# LINQラムダ式入門 1. 便利なとこから始めようC# LINQラムダ式入門 2. 次のLINQ構文C# LINQラムダ式入門 3. 後はとりあえず俯瞰してみるC# LINQラムダ式入門 4. LINQの引数の型を理解するC# LINQラムダ式入門 5. ラムダ式をもう少し詳しく見てみる