匿名メソッドをブロックのように使ってSmalltalkのselect:みたいなEnumeratorを
public class AnyObject : List{ public IEnumerator Select(AnyObjectSelector anAnyObjectSelector) { foreach (AnyObject anAnyObject in this) { if (anAnyObjectSelector(anAnyObject)) { yield return anAnyObject; } } } public delegate bool AnyObjectSelector(AnyObject anAnyObject); }
すげー!
ちなみに使い方はこんな感じ。
for (IEnumeratoraEnumerator = aAnyObjectCollection.Select( delegate (AnyObject anAnyObject) { return anAnyObject is OtherObject; } ); aEnumerator.MoveNext(); ) { Console.WriteLine(aEnumerator.Current.ToString() + "is OtherObject"); }
なんかもう、文法の基になったはずのC言語の欠片も残ってない……。
その上、この使い方むちゃくちゃ便利。
やるな、C#2.0。
ちなみに実現したかったネタ元のSmalltalkのサンプルソース。
(aAnyObject select: [ :anObject | anObject isKindOf: OtherObject ]) do: [ :anObject | Transcript cr; show: anObject ] .
さすがに私のC#の知識ではここまでシンプルには書けないなぁ……。