Take

いやいや、やっぱり Map はいるよね、ちゃんと遅延評価しているし、と思って遅延評価を見るために Take を書いてみた。


static IEnumerable<T> Take<T>( int n, IEnumerator<T> it )
{
for ( int i = 0; i < n; i++ )
{
if ( it.MoveNext() )
yield return it.Current;
else
yield break;
}
}

これを使ってみる。


static void Main( string[] args )
{
List<int> list = new List<int>( new int[] { 1, 2, 3, 4, 5 } );

Converter<int, int> suquares = delegate( int n ) { return n * n; };

foreach ( int var in Take<int>( 2, ( Map<int, int>( suquares, list.GetEnumerator() ) ).GetEnumerator() ) )
{
Console.WriteLine( var );
}
Console.Read();
}

ステップ実行してみると、きちんと遅延評価してるのがわかります。
やっと yield の真価がみえてきたような。