如果在C#中使用foreach语句,必须先在迭代的类中实现IEnumerabl接口或ICollection接口。上述处理过程实现起来会比较麻烦,为解决这个问题,在C#中引入了一种名为迭代器的概念。只要在C#项目程序的类或结构中实现迭代器,那么这个类和结构就支持foreach迭代,而不再需要实现全部的IEnumerabl接口。当编译器检测到迭代器时,项目程序将自动实现IEnumerabl接口或实现IEnumerabl接口的方法和属性。
迭代器能够生成相同类型的有序代码块,通过上述代码块能够实现特定的处理功能。迭代器代码块和普通代码块类似,只是在迭代器代码块里存在不定量的yield语句。具体使用格式如下:
其中,yield return语句生成迭代的下一个值;yield break语句设置迭代终止完成。即关键字yield用于设置返回值,当程序达到yield return语句时,会保存当前的位置。当下次调用迭代器时,将从这个位置重新开始执行。
可以在一个类中实现多个迭代器,但是其中的每个迭代器都必须具有唯一的名称,并能够在foreach语句中被客户端调用。
注意
迭代器不是一种成员,而是一种实现函数成员的方法。迭代器可以作为函数、运算符或get访问器的代码体。通过使用迭代器成员,可以被其他成员实现重写或重载。
迭代器在集合类中的应用比较常见,它能够提供一种简单的方法来迭代不常用的数据结构。
实例42:在集合类中应用迭代器
下面将通过一个简单实例来说明在集合类中使用迭代器的过程。本实例保存在“光盘:\daima\9”文件夹内,项目名为diedaiqi。本实例的功能是,输出显示集合类内的元素。实例文件的主要代码如下:
上述实例代码的设计流程如下。
1)通过using调用System.Collections类,定义命名空间diedaiqi。
2)定义IEnumerabl接口的类DaysOfTheWeek。
3)定义数组m_Days,并设置存储七个成员值。(www.xing528.com)
4)通过迭代逐一遍历数组m_Days存储的成员数据。
5)定义类DaysOfTheWeek对象Week。
6)使用foreach将数组内数据输出显示。
执行后将输出显示数组内的成员数据,如图9-18所示。
图9-18 实例执行结果
多学一招
在使用迭代器时应该注意如下几点。
1)迭代器不是一种成员,而是一种实现函数成员的方法。迭代器可以作为函数、运算符或get访问器的代码体。通过使用迭代器成员,可以被其他成员实现重写或重载。
2)可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在foreach语句中被客户端代码调用,例如:foreach(int x in SampleClass.Iterator2){}。
3)迭代器的返回类型必须为IEnumerable、IEnumerator、IEnumerable<(Of<(T>)>)或IEnumerator<(Of<(T>)>)。
4)yield关键字用于指定返回的一个或多个值。到达yield return语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。
使用迭代器的基本原则是,如果要迭代一个类则使用GetEnumerator(),返回类型是Enumerator。如果要迭代一个类成员,则使用Enumerable。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。