それ,名前のあるメソッドで書けるよ
『最終回 小さな改善とコンパイラの新機能、そして3.0への展望 - 連載:C# 2.0入門 - @IT』より.
例えば、次のリスト3のSortメソッドとForEachメソッドの引数は匿名メソッドである。
using System; using System.Collections.Generic; class Program { static void Main(string[] args) { List<int> list = new List<int>(); list.Add(1); list.Add(3); list.Add(2); list.Sort(delegate(int x, int y) // 匿名メソッド { return x - y; }); list.ForEach(delegate(int i) // 匿名メソッド { Console.WriteLine(i); }); // 出力: // 1 // 2 // 3 } }リスト3 匿名メソッドの使用例
この2つのメソッドの引数をC# 3.0のラムダ式で書き直すと以下のようになる。
list.Sort( (x, y) => x - y ); list.ForEach( i => Console.WriteLine(i) );リスト4 リスト3のSortメソッドとForEachメソッドをラムダ式に置き換えた例
(中略)
匿名メソッドに比べれば、まさに圧倒的な短さだ。これならば、整数や文字列に近い気軽さで、いくらでもコードの断片を記述することができる。もはや、こう書いたらよいのではないか、あるいは書くべきであるというレベルではない。そう書くのが当たり前という前提で、気軽に書けるように構文が拡張されている。
主張はごもっともですが,例がちょっとちぐはぐな.というかこのコードバグありますよね?
例のようなコードだと,C# 3.0 を待つまでもなく,以下のコードに落ち着いてしまうので,そもそもラムダ式の出番が無かったり.
// C# 2.0 list.Sort(Comparer<int>.Default.Compare); list.ForEach(Console.WriteLine);
ちなみに、
PersonCreator creator = new PersonCreator(Target);
という式は、VS.NET 2003でも構文エラーにしないためにこのように記述しているが、VS 2005では、
PersonCreator creator = Target;
で構わない。
過去の関連記事
余談
List のソートは以下のようにも書けます.
list.Sort(); // or list.Sort(Comparer<int>.Default);
ソースコードを追いかけられる人 は動作を比べてみると面白いかも.結構えぐい最適化やってますな.