匿名メソッドをブロックのように使って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 (IEnumerator aEnumerator = 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#の知識ではここまでシンプルには書けないなぁ……。