1、Foreach只能遍历一个可枚举的集合(就是实现了IEnumerable接口)
2、System.Array类、String类等实现了IEnumerable接口。
3、在IEnumerable接口中,包含了一个名为GetEnumerator的方法: IEnumerator GetEnumerator( );
GetEnumerator方法返回一个枚举器对象(枚举器对象用于遍历(可枚举)集合中的元素),这个枚举数类实现了IEnumerator接口。
IEnumerator接口规定了以下属性和方法:
Ⅰ、Object Current {get;}
Ⅱ、Bool MoveNext();
Ⅲ、 Void Reset();
4、 使用一个集合的GetEnumerator方法来创建一个枚举数,然后反复调用MoveNext方法,并获取Current属性的值,就可以每次在该集合中移动一个元素的位置。这正是foreach语句所做的事情。
5、一个迭代器块(iterator block)是一个能够产生有序的值序列的块。迭代器块和普通语句块的区别就是其中出现的一个或多个yield语句。
6、在迭代器块中,使用yield关键字选择要在foreach循环中使用的值。其语法如下:
yield return value;
对于迭代器,可以使用下面的语句中断信息返回foreach循环的过程:
yield break;
在遇到迭代器中的这个语句时,迭代器的处理会立即中断,就像foreach循环使用它一样。
7、编译器生成的枚举数中Reset方法没有实现。而它是接口需要的方法,因此调用实现时总是抛出System.NotSupportedException异常。
public class DaysOfTheWeek : System.Collections.IEnumerable { string[] m_Days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" }; public System.Collections.IEnumerator GetEnumerator() { for (int i = 0; i < m_Days.Length; i++) { yield return m_Days[i]; } } } class TestDaysOfTheWeek { static void Main() { // Create an instance of the collection class DaysOfTheWeek week = new DaysOfTheWeek(); // Iterate with foreach foreach (string day in week) { System.Console.Write(day + " "); }
IEnumerator ee= week.GetEnumerator();
while (ee.MoveNext())
{
Console.WriteLine(ee.Current);
}
}
}
命名迭代器
class Program { static void Main(string[] args) { Class1 c = new Class1(); foreach (int i in c.MaxToMin(1, 2)) { Console.WriteLine(i); } foreach (object i in c.MinToMax) { Console.WriteLine(i.ToString()); } } } class Class1 { // 定义一个命名的迭代器,并可以提供参数 public IEnumerable MaxToMin(int min, int max) { for (int i = max; i >= min; i--) { yield return i; // 返回元素 } yield return "ktgu"; } // 定义一个迭代器类型的属性, public IEnumerable MinToMax { //this表示该类实例,因为该类实现了GetEnumerator(),它是可枚举的 get { yield return this; } } }