C# 枚举器和迭代器(常见迭代器模式)
常见迭代器模式
前面两节的内容显示了我们可以创建迭代器来返回可枚举类型或枚举器。图19-11总结了如
何使用常见的迭代器模式。
- 当我们实现返回枚举器的迭代器时,必须通过实现GetEnumerator来让类可枚举,它返回
由迭代器返回的枚举器,如图19-11中左半部分所示。 - 在类中实现返回可枚举类型的迭代器时,我们可以让类实现GetEnumerator来让类本身可
枚举,或不实现GetEnumerator,让类不可枚举。- 如果实现GetEnumerator,让它调用迭代器方法以获取自动生成的实现1Enumerab1e
的类实例。然后,从iFnumerab1e对象返回由GetEnumerator创建的枚举器,如图19-11
右边所示。 - 如果通过不实现GetEnumerator使类本身不可枚举,仍然可以使用由迭代器返回的可枚
举类,只需要直接调用迭代器方法,如图19-11中右边第二个foreach语句所示。
- 如果实现GetEnumerator,让它调用迭代器方法以获取自动生成的实现1Enumerab1e
产生多个可枚举类型
在下面的示例中,spectrurn类有两个可枚举类型的迭代器—— 一个从紫外线到红外线枚举光
谱中的颜色,而另一个以逆序进行枚举。注意,尽管它有两个方法返回可枚举类型,但类本身不
是可枚举类型,因为它没有实现GetEnumerator。
using System;
using System.Collecions.Generic;class Spectrum
{string[] colors={"violet","blue","cyan","green","yellow","orange","red"};public IEnumerable<string>UVtoIR(){for(int i=0;i<colors.Length;i++)yield return colors[i];}public IEnumerable<string>IRtoUV(){for(int i=colors.Length-1;i>=0;i--)yield return colors[i];Console.WriteLine();foreach(string color in Spectrum.IRtoUV())Console.Write($"{color}");Console.WriteLine();}
}