ある程度C#を使ってみて思っていたことではあるけれど、ラムダ式の使い方がわかったら、さらに強く思うようになった。
リストから特定の条件のオブジェクトを探したいとき、 Delphiなら、forループを回してひとつひとつifで判断して見つけて、break、又はResultを設定してexit というのがパターンだと思う。
C#なら、例えば30GB以上空いているドライブを探したいとき、 DriveInfo.GetDrives().First(item => (item.IsReady && item.TotalFreeSpace > 30*1024*1024*1024)) だけで済む。
MSDNライブラリのヘルプだとラムダ式を使ったサンプルは書いてないし、ラムダ式の説明もわかりにくく何に使うのか良くわからない。 いちいちメソッドを作らないといけないのか、と思っていたのでほとんど使っていなかった。
けれどIEnumerableの拡張メソッドとかList<T>のメソッド等々、条件を関数やデリゲートで受け取るメソッドが異様に多いので、ひょっとしてと思って調べてみた。
ラムダ式 item => (item.IsReady && item.TotalFreeSpace > 30*1024*1024*1024) は
var func(var item) { return (item.IsReady && item.TotalFreeSpace > 30*1024*1024*1024); } ※実際にはvarを使ってメソッドを書くことはできないけれど、ラムダ式では要求されている関数やデリゲートの型から推論される。
というような意味なんだそうだ。 これを見たとき、ラムダ式の前にあった大きな壁がすっと消えた。 いままで凄い無駄なコードを書いていたような気がする。
※上のFirstはLINQの機能だから.NET3.5が必要だけれど、自分で使うだけだから一般的かどうかなんて無視。
やっぱり全く新しい開発環境は、ある程度使い込んでから改めて全ての機能を見返す必要があるみたいだ。 初期の頃に書くコードはどうしても今までの知識の範囲でしか考えられないから無駄が多くなる。
オブジェクト指向の概念はC++の入門書で読んだことがあったけれど、実際に使うのはDelphiが初めてだった。 その頃ちゃんとオブジェクト指向の考え方を理解するまでに書いたコードもかなり無駄が多かった。
そういえばコードスニペットの定義の仕方がわかったので、書き込み時に何か処理をしたいプロパティのひな形が作れたっけ。 LINQもまだちゃんと使い込めていないし、まだまだC#にもVisual Studioにも知らないことが多そうで楽しみだ。
この記事に設定されているタグ
このブログ内:C#
.NET
Delphi
ラムダ式
FC2ブログ全体:C# .NET Delphi ラムダ式
|