Foreach能够获取数组中的每一个元素,原因数组能够提供一个枚举器的对象。对于枚举器类型而言,必须有一个方法来获取它。获取一个对象枚举器的方法是调用对象的GetEnumerator方法。数组是可枚举类型。
IEnumerator接口:
实现了IEnumerator接口的枚举器包含了Current、MoveNext以及Reset函数成员。
Current是返回序列中当前位置的属性:
- 它是只读属性。
- 它返回object类型的引用,所以可以返回任何类型
MoveNext是枚举器位置前进到下一项的方法。它也返回bool,指示新的位置是有效还是无效:
- 如果位置有效,返回true
- 如果位置无效,返回false
- 枚举器原始位置在序列的第一项之前,因此MoveNxet必须在第一次使用Current之前。
Rest是把位置重置为原始状态。
IEnumerable接口:
可枚举类是指实现了IEnumerable接口的类。它只有一个成员——GetEnmuerator方法,返回对象的枚举器。
示例:
using System;
using System.Collections;
class ColorEnumerator:IEnumerator{
string []_colors;
int _positon=-1;
public ColorEnumerator(string []the){
_colors=new string[the.length];
for(int i=0;i<the.length;i++)
_colors[i]=the[i];}
public object Current(){
return _colors[_positon];}
public bool MoveNext(){
if(_positon==-1||_positon>=_colors.lenth)
return false;
_positon++;
return true;}
public void Reset(){
_positon=-1;}}
class test:IEnumerable{
string Colors={“Black”,”White”};
public IEnumrator GetEnmurator{
return new ColorEnumrator(Colors);}
class Program{
static void main(){
test t=new test();
for(var s in test)
Console.WriteLine(s);
}}
泛型枚举接口:
IEnumerator<T> 返回枚举类型
IEnumerable<T> 返回枚举器类型
迭代器
从C#2.0开始提供了更简单的创建枚举器和可枚举类型的方式。实际上编译器为我们创建他们。这种结构叫做迭代器。我们可以把手动编码的可枚举类型和枚举器替换为由迭代器生成的可枚举类型和枚举器。
迭代器块:有一个或多个yield语句的代码块。
常见迭代器模式:
当我们实现返回枚举器的迭代器时,必须实现GetEnumerator来让类可枚举,它返回由迭代器返回的枚举器.
如果我们在类中实现迭代器返回可枚举类型,我们可以让类实现GetEnumerator来让类本身可被枚举,或不实现GetEnumerator让类本身不可被枚举。
如果实现GetEnmertator,让它调用迭代器方法以获取自动生成的实现IEnumerable的类实例。然后,从IEnumerable对象返回的GetEnumerator创建的枚举器。第一个foreach
如果不实现GetEnumerator使类本身不枚举,仍然可使用由迭代器返回的可枚举类,只需要调用迭代器方法。第二个foreach
class Myclass{
public IEnumerator<string>GetEnumerator(){
return IteratorMethod().GetEumerator();}
public IEnumerable<string>IteratorMethod(){
yield return “Fuck”;
yield return “Fuck1”;
yield return “Fuck2”;}}
……
Main(){
Myclass mc=new Myclass();
foreach(var str in mc)
……
foreach(var str in mc.IteratorMethod())
……