1.首先我們看下IEnumerable接口定義:
namespace System.Collections
{
// Summary:
// Exposes the enumerator, which supports a simple iteration over a non-generic
// collection.
[ComVisible(true)]
[Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
{
// Summary:
// Returns an enumerator that iterates through a collection.
//
// Returns:
// An System.Collections.IEnumerator object that can be used to iterate through
// the collection.
[DispId(-4)]
IEnumerator GetEnumerator();
}
}
這個接口是重中之重,迭代器就是實現這個接口才能使之迭代的。
2.C#的yield關鍵字您也必須知道
yield在迭代器塊中用於向枚舉數對象提供值或發出迭代結束信號。它有兩種表現形式:
yield return <expression>;
yield break;
請注意:
expression 必須可以隱式轉換為迭代器的 yield 類型
yield語句只能主線在迭代模塊中,而不能出現在不安全模塊,也不能出現在匿名方法中;當和 expression 一起使用時,yield return 語句不能出現在 catch 塊中或含有一個或多個 catch 子句的 try 塊中。
3.介紹迭代器概念
其實所謂迭代就是指循環,迭代器是指實現該循環的一種方式。
迭代器是C#2.0增加的功能,它可以是方法、get訪問器或運算符,最終它可以使您能夠在類或結構中支持foreach迭代。在實現上您不必實現整個IEnumerable接口,您只需提供一個迭代器即可,當編譯器監測到迭代器時間,她會自動生成IEnumerable 或 IEnumerable<T> 接口的 Current、MoveNext 和 Dispose 方法。
迭代器是可以返回相同類型的值的有序序列的一段代碼,它使用yield return語句一次返回每個元素,使用yield break終止迭代,它的返回類型必須是IEnumerable、 IEnumerator、IEnumerable<T> 或 IEnumerator<T>。
3.創建迭代器最常用的方法是實現IEnumerable接口中的GetEnumerator方法,IEnumerable接口如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ctochina.net
{
class Program
{
static void Main(string[] args)
{
MyIterator myIterator = new MyIterator();
foreach (int i in myIterator)
{
Console.WriteLine(i);
}
}
}
public class MyIterator
{
public IEnumerator GetEnumerator()
{
for(int i=1;i<8;i++)
{
yield return i;
}
}
}
}
輸出:
1 2 3 4 5 6 7
注意System.Collections;命名空間的引用,因為IEnumerator在其中
由於是實現IEnumerable接口中的GetEnumerator方法,所以一個類中只能有一個GetEnumerator迭代。
4.另一種實現迭代的方法,代碼接著上例如:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ctochina.net
{
class Program
{
static void Main(string[] args)
{
MyIterator myIterator = new MyIterator();
//迭代一