IEnumerable与IEnumerator学习(一):在类中添加GetEnumerator()方法使类或类的集合可以被迭代

在C#中,使用foreach来遍历一个数组、List是十分方便的,而之所以能用foreach来遍历一个数组,是因为系统自动为数组实现了IEnumerable接口,IEnumerable接口中包含的GetEnumerator()返回一个IEnumerator迭代器,使迭代数组变为可能。

实际上,我们的自建类也可以使用foreach来遍历其中特定的内容,类并不需要继承或实际实现IEnumerable接口,只需要添加一个GetEnumerator()方法,返回值是IEnumerator,T为需要在foreach中被访问对象的类型。实现一个这样的类可以加深我们对IEnumerable与IEnumerator接口的理解。

范例如下:

首先创建一个类MyGraphicCards,类中包含了一个List,一个为List增加元素的方法AddModel,以及了解当前List长度的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来遍历类中的List:

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);
            }
            Console.WriteLine();
            foreach (var myModel in myGraphicCardList.Subset(2,2))
            {
                Console.WriteLine(myModel);
            }
            Console.WriteLine();

输出结果为

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


你可能感兴趣的:(C#)