[C# 2.0] 匿名メソッドもラムダ式と同じように書ける
C# 3.0 より導入されたラムダ式により、C# のソースは劇的に変化した。
とはいえ、これは C# 2.0 にもあった匿名メソッドをより簡潔にしたものであるので C# 2.0 でも同じようなことは書ける。
2.0 世代に、積極的に匿名メソッドを書いているソースは自分は見たことがないのだが、C# 3.0 以降の書き方に慣れてしまうと 2.0 世代のソースは冗長なものに見えてしまう。
しかし、以下のようにも書けてしまう。
一見すると意味不明ではあるがエラーにはならない。
未だに 2.0 でやってるような現場も多いが、使える機会があったら試してみよう。
確かに C# 2.0 時代は foreach をとにかく多用して、条件式で判断するようなソースをゴリゴリ書いていたものだ。
とはいえ、これは C# 2.0 にもあった匿名メソッドをより簡潔にしたものであるので C# 2.0 でも同じようなことは書ける。
2.0 世代に、積極的に匿名メソッドを書いているソースは自分は見たことがないのだが、C# 3.0 以降の書き方に慣れてしまうと 2.0 世代のソースは冗長なものに見えてしまう。
foreach の書き換え。
List< int> lst = new List< int>(); lst.Add(-10); lst.Add(5); lst.Add(24); lst.Add(112); Listだいぶ簡潔に書ける。lst2 = lst.FindAll(delegate(int i) { return i < 10; }); lst2.ForEach(delegate(int i) { Console.WriteLine(i.ToString()); }); // -10 // 5
しかし、以下のようにも書けてしまう。
一見すると意味不明ではあるがエラーにはならない。
lst.FindAll(delegate(int i) { return i < 10; }).ForEach(delegate(int i) { Console.WriteLine(i.ToString()); });
値の一致
List< int> lst = new List< int>(); lst.Add(-10); lst.Add(5); lst.Add(24); lst.Add(112); bool b = lst.Exists(delegate(int i) { return i.Equals(5); }); Console.WriteLine(b); // True
文字列の検索
List< string> lst = new List< string>(); lst.Add("taro"); lst.Add("jiro"); lst.Add("hogetaro"); lst.Add("hogejiro"); // あいまい検索。 List< string> lstLike = lst.FindAll(delegate(string s) { return s.Contains("taro"); }); lstLike.ForEach(delegate(string s) { Console.WriteLine(s); }); // taro // hogetaro // 厳密な文字検索。 List< string> lstTaro = lst.FindAll(delegate(string s) { return s.Equals("taro"); }); lstTaro.ForEach(delegate(string s) { Console.WriteLine(s); }); // taro今さらだが、こんな書き方もある。
未だに 2.0 でやってるような現場も多いが、使える機会があったら試してみよう。
確かに C# 2.0 時代は foreach をとにかく多用して、条件式で判断するようなソースをゴリゴリ書いていたものだ。