首页 理论教育 高效使用C#迭代器,轻松支持foreach迭代

高效使用C#迭代器,轻松支持foreach迭代

时间:2023-10-22 理论教育 版权反馈
【摘要】:只要在C#项目程序的类或结构中实现迭代器,那么这个类和结构就支持foreach迭代,而不再需要实现全部的IEnumerabl接口。迭代器能够生成相同类型的有序代码块,通过上述代码块能够实现特定的处理功能。图9-18 实例执行结果多学一招在使用迭代器时应该注意如下几点。通过使用迭代器成员,可以被其他成员实现重写或重载。下次调用迭代器时将从此位置重新开始执行。

高效使用C#迭代器,轻松支持foreach迭代

如果在C#中使用foreach语句,必须先在迭代的类中实现IEnumerabl接口或ICollection接口。上述处理过程实现起来会比较麻烦,为解决这个问题,在C#中引入了一种名为迭代器的概念。只要在C#项目程序的类或结构中实现迭代器,那么这个类和结构就支持foreach迭代,而不再需要实现全部的IEnumerabl接口。当编译器检测到迭代器时,项目程序将自动实现IEnumerabl接口或实现IEnumerabl接口的方法和属性。

迭代器能够生成相同类型的有序代码块,通过上述代码块能够实现特定的处理功能。迭代器代码块和普通代码块类似,只是在迭代器代码块里存在不定量的yield语句。具体使用格式如下:

978-7-111-36370-5-Part02-276.jpg

其中,yield return语句生成迭代的下一个值;yield break语句设置迭代终止完成。即关键字yield用于设置返回值,当程序达到yield return语句时,会保存当前的位置。当下次调用迭代器时,将从这个位置重新开始执行。

可以在一个类中实现多个迭代器,但是其中的每个迭代器都必须具有唯一的名称,并能够在foreach语句中被客户端调用。

注意

迭代器不是一种成员,而是一种实现函数成员的方法。迭代器可以作为函数、运算符或get访问器的代码体。通过使用迭代器成员,可以被其他成员实现重写或重载。

迭代器在集合类中的应用比较常见,它能够提供一种简单的方法来迭代不常用的数据结构

实例42:在集合类中应用迭代器

下面将通过一个简单实例来说明在集合类中使用迭代器的过程。本实例保存在“光盘:\daima\9”文件夹内,项目名为diedaiqi。本实例的功能是,输出显示集合类内的元素。实例文件的主要代码如下:

978-7-111-36370-5-Part02-277.jpg

上述实例代码的设计流程如下。

1)通过using调用System.Collections类,定义命名空间diedaiqi。

2)定义IEnumerabl接口的类DaysOfTheWeek。

3)定义数组m_Days,并设置存储七个成员值。(www.xing528.com)

4)通过迭代逐一遍历数组m_Days存储的成员数据。

5)定义类DaysOfTheWeek对象Week。

6)使用foreach将数组内数据输出显示。

执行后将输出显示数组内的成员数据,如图9-18所示。

978-7-111-36370-5-Part02-278.jpg

图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。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈