画期的なイテレータ!!

ホームC#プログラミング入門講座 > 画期的なイテレータ!!

画期的なイテレータ!!

foreachの常識を覆す!

C#2.0の新機能「イテレータ」は、foreach構文の常識を覆します。

foreachは常に配列とセットで利用してきました。in の後ろには必ず、配列がありました。ですから、入門講座でも配列のところで簡単に紹介しただけです。

ですが、C#2.0ではinの後ろにメソッドがきます。もちろん、配列でもOKですが、イテレータによってメソッドをおくことができるようになったんです。

foreach (char ch in Reverse(before))

これは、今回扱うサンプルの一部分です。in の後ろには Reverse() というメソッドがあり、before という変数を渡しています。

C#2.0のイテレータは、常識破りです。

サンプル

using System;
using System.Collections;
using System.Text;

namespace IteratorVersion
{
    class Program
    {
        public static IEnumerable Reverse(string text)
        {
            for (int i = text.Length - 1; i >= 0; i--)
                yield return text[i];
        }

        static void Main(string[] args)
        {
            string before = "TRICK";
            string afeter = "";

            foreach (char ch in Reverse(before))
                afeter += ch;

            Console.WriteLine("元の文字: " + before);
            Console.WriteLine("後の文字: " + afeter);
        }
    }
}

これは、私の好きな定番サンプル「反転文字列」です。入門講座を読んでいたら、どっかで同じ機能に出会ったかもしれません。

今回は、それをイテレータで実装してみました。Reverse() というメソッドが、それです。注目すべきは、3箇所だけ。

public static IEnumerable Reverse(string text)

IEnumerable がイテレータの特徴です。IEnumerable以外にもイテレータを使う型はあるのですが、残念なことに私はそれらを区別できません。まあ、当分IEnumerableだけ知っとけばいいでしょう。

yield return text[i];

yieldがイテレータの特徴です。return は普通に使ってきましたが、イテレータは yield return と書きます。

残りの特徴の1つは、前の項目で書いたメソッドの件です。3つとも、深く考える必要はありません。ちょっと、動作を追ってみましょうか。

メソッドが配列になる

プログラミングはイメージです。イテレータは、イメージできるかどうかでそのすごさが分かります。

まず、プログラムはforeachを見つけ出します。その中に、Reverse() を見つけたら、プログラムは Reverse() へ飛んでいきます。イメージしてください。

Reverse() まで飛んでいったら、変数text は "TRICK" になります。次のforはただの繰り返しです。ただし、この繰り返しは数が減っていきますよ。

"TRICK" は5文字なので、i は4,3,2,1,0と減っていきます。最後は1ではなく、0です。たとえば、text[1]は'R'ですよ。'T'ではありません。

プログラムはReverse()の中にいます。yield return に出会うと、値をパラパラと返していきます。'K' 'C' 'I' 'R' 'T' の順に、パラパラと返されます。どこに返されるかというと、foreachのinの後ろ。Reverse(before)のとこ。

パラパラとした繰り返しが終わったとき、メソッドはすでに配列になってます。"TRICK" の文字が反転して、Reverse(before)と書いているのは"KCIRT"と同じになります。メソッドが、配列に生まれ変わります。この瞬間が、イテレータといえるでしょうね。

もう後は普通のforeachです。メソッドが、配列になって戻ってる。あとはforeachだけ。

イメージしてください。文字が次々と反転して、in の直後に飛んで戻ってくるシーンを。最後の'T'に達したとき、メソッドが配列に変身するその瞬間を。これは、すごい。

まとめ

C#2.0の新機能の中で、まったく新しいのはこのイテレータだけといえるかもしれません。ジェネリックは、改良の範疇です。ですが、イテレータはまったく新しいforeachの使い方を伝授してくれます。

イテレータは反復子などと言われますが、そんなことは聞いた瞬間に忘れてしまえ、といいたいですね。どうでもいい。「メソッドが配列に変わる」ということが、最も重要なのです。

書き方も使い方も、非常に単純で明瞭です。ですが、「繰り返し」を強力にサポートします。ぜひ、使って欲しいです。


[ ステップアップC# ]