IEnumerableとIEnumerator学習(一):クラスにGetEnumerator()メソッドを追加し、クラスまたはクラスのセットを反復可能にする

2784 ワード

C#では、foreachを使用して配列、Listを巡回するのが便利ですが、foreachを使用して配列を巡回できるのは、システムが自動的に配列にIEnumerableインタフェースを実現し、IEnumerableインタフェースに含まれるGetEnumerator()がIEnumerator反復器を返し、反復配列を可能にするためです.
実際には、カスタムクラスはforeachを使用して特定のコンテンツを巡回することもできます.クラスはIEnumerableインタフェースを継承したり実装したりする必要はありません.GetEnumerator()メソッドを追加するだけです.戻り値はIEnumeratorで、Tはforeachでアクセスするオブジェクトが必要なタイプです.このようなクラスを実装することで、IEnumerableとIEnumeratorインタフェースの理解を深めることができます.
例は次のとおりです.
まずクラスMyGraphicCardsを作成します.クラスにはリストが含まれています.リストに要素を追加する方法AddModelと、現在のリストの長さを知るLength方法が含まれています.
public class MyGraphicCards
    {
        public List Models = new List();

        public void AddModel(string newModel)
        {
            Models.Add(newModel);
        }

        public int Length()
        {
            return Models.Count;
        }

        public IEnumerator GetEnumerator()//  foreach     IEnumerator  
        {
            for (int i = 0; i < Models.Count; i++)
            {
                yield return Models[i];
            }
        }

        public IEnumerable Reverse()//Reverse       List   ,   IEnumerable       GetEnumerator  
        {
            for (int i = Models.Count-1; i >=0; i--)
            {
                yield return Models[i];
            }
        }

        public IEnumerable Subset(int index, int length)//Subset        List    
        {
            for (int i = index ; i < index + length; i++)
            {
                yield return Models[i];
            }
        }

    }

したがって、Mainメソッドではforeachを使用してクラスのリストを巡回することができる.
MyGraphicCards myGraphicCardList = new MyGraphicCards();
            myGraphicCardList.AddModel("GeForce 8800 Ultra");
            myGraphicCardList.AddModel("Radeon HD 5870");
            myGraphicCardList.AddModel("GeForce GTX 780 Ti");
            myGraphicCardList.AddModel("Radeon R9 Fury X");
            foreach (var myModel in myGraphicCardList)
            {
                Console.WriteLine(myModel);
            }
            Console.WriteLine();
            foreach (var myModel in myGraphicCardList.Reverse())
            {
                Console.WriteLine(myModel);
            }

出力結果は
GeForce 8800 Ultra
Radeon HD 5870
GeForce GTX 780 Ti
Radeon R9 Fury X

Radeon R9 Fury X
GeForce GTX 780 Ti
Radeon HD 5870
GeForce 8800 Ultra

GeForce GTX 780 Ti
Radeon R9 Fury X