イテレータ(Iterator)のサンプルを書いてみる [C#]

う~ん 確かにイテレータは覚えたら便利かも知れない。

と感じながらも何故にそこらで見るサンプルはイテレータのポイントである処理の中断(待ち)を入れないのだろう?
そんなプログラム走らせても単なる反復処理と変わらないじゃないか!
とか思いながら、イテレータのサンプル書いてみた。

自分でハードル上げてるわりには大したものではないが、所謂コルーチン的な動きになっていると思われ。

とりあえずコードから

static IEnumerable IteratorFunc(string s)
{
    for(int i = 0 ; i < s.Length; i++)
    {
        yield return s[i];
    }
}

static void Main(string[] args)
{
    foreach (char c in IteratorFunc("abc"))
    {
        Console.WriteLine("Key: " + c);
        while (c != Console.ReadKey().KeyChar) 
        {
            Console.WriteLine();
        }
        Console.WriteLine();
    }
}

『IteratorFunc(string)』は引数の文字列から一文字づつ返す。
foreach (char c in IteratorFunc("abc"))
foreach で IteratorFunc の戻り値が『c』に入り、
while (c != Console.ReadKey().KeyChar) 
コマンドプロンプトで押されたキーと比較し、同じキーが押されるまで while で回り、一致すると次の文字を表示していく、というもの。

指定の文字列から一文字づつ返す処理でわざわざイテレータを使っているわけですが、単なる反復処理では出来ない動作になっていると思います。


IEnumeratorを併用する

せっかくIteratorFuncメソッドの戻り値の型がIEnumerableなので、こんな書き方もできますよ、的な。
static void Main(string[] args)
{
    IEnumerator ie = IteratorFunc("abc").GetEnumerator();
    while (ie.MoveNext())
    {
        Console.WriteLine("Key: " + ie.Current);
        while ((char)ie.Current != Console.ReadKey().KeyChar)
        {
            Console.Write("\n");
        }
        Console.Write("\n");
    }
}
やってることは上と同じ。

簡単だし、覚えてしまえば実におもしろい。

0 Comments:

Sony Style(ソニースタイル)
デル株式会社

Recent Posts