C# 入門 & 実践 / C sharp

4-8. [ ジェネリック/コレクション ] 2. インターフェイスの実装 / IEnumerable で foreach を実装


IEnumerable ジェネリックインターフェイスを実装した、ジェネリッククラス BbGeneric を作ってみます。
    public class BbGeneric<T> : IEnumerable<T>
    {
        private T[] ts;
        private int ctr = 0;

        public BbGeneric(T[] args)
        {
            ts = new T[args.Length];
         
            for( int i=0; i<args.Length; i++)
            {
                ts[i] = args[i];
            }
        }
        #region IEnumerable<string> メンバ

        // 列挙可能なクラスは・・・列挙子を返すことが出来る・・・
        public IEnumerator<T> GetEnumerator()
        {
            foreach (T s in ts)
            {
                yield return s;
            }
        }

        #endregion

        #region IEnumerable メンバ

        IEnumerator IEnumerable.GetEnumerator()
        {
            throw new Exception("The method or operation is not implemented.");
        }

        #endregion
    }


    class Tester
    {
        static void Main()
        {
            string[] str = { "朝", "昼", "夕", "夜" };
            foreach (string x in str)
            {
                Console.WriteLine("str : {0}", x);
            }

            // stringで生成!
            BbGeneric<string> bb = new BbGeneric<string>(str);
            foreach (string x in bb)
            {
                Console.WriteLine("bb : {0}", x);
            }
            // 今度は int で生成!
            int[] i_s = { 1,2,3,4,5 };
            BbGeneric<int> bb_i = new BbGeneric<int>( i_s );
            foreach ( int x in bb_i )
            {
                Console.WriteLine("bb_i : {0}", x);
            }
        }
    }

str : 朝
str : 昼
str : 夕
str : 夜
bb : 朝
bb : 昼
bb : 夕
bb : 夜
bb_i : 1
bb_i : 2
bb_i : 3
bb_i : 4
bb_i : 5

とこのように自分の作ったクラスで foreach を実装できました^-^。

yield return s; もポイントですね

yield の使用は、IEnumerable インターフェイスで GetEnumerator メソッドを実装するのが最も一般的な方法だそうですので、
今回の使い方を覚えておけば問題ないようです。

yield : 列挙子オブジェクトに値を挿入する場合、または反復処理の終了を通知する場合に、iterator ブロック内で使用されます。形式は次のいずれかになります。
yield return expression;
yield break;



4-7. [ ジェネリック/コレクション ] 1. ジェネリックの基本 « 4. C# 入門 Level 2 » 4-9. [ ジェネリック/コレクション ] 3. 制約


C# 入門 & 実践 / C sharp