這裡僅針對非泛型迭代器加以說明,泛型迭代器類似。
代碼一:
public class Cars
{
private int[] intArr = { 1, 2, 3, 4, 5, 6, 7 };
/// <summary>
/// 命名迭代器
/// </summary>
/// <param name="isReverse">是否倒序迭代</param>
/// <returns></returns>
public IEnumerable SortEnum(bool isReverse)
{
if (!isReverse)
{
for (int i = 0; i < intArr.Length; i++)
{
yield return intArr[i];
}
}
else
{
for (int i = intArr.Length - 1; i >= 0; i--)
{
yield return intArr[i];
}
}
}//fun
}//clas
然後就可以對該類進行迭代操作了,代碼如下:
Cars c = new Cars(); foreach (var item in c.SortEnum(true)) { Console.WriteLine(item); }
其實編譯時間編譯器為該類產生了一個內部類,該內部類就實現了IEnumerable和IEnumerator這兩個介面。
代碼二:
返回IEnumerator的方法
public class Cars
{
public IEnumerator GetEnumerator()
{
yield return "1";
yield return "2";
yield return "3";
}//fun
}//clas
範例程式碼如下:
//注意這裡c2不用調用方法了 Cars c2 = new Cars(); foreach (var item in c2) { Console.WriteLine(item); }
編譯器也為該類產生了一個內部類,該內部類實現了IEnumerator介面。
由此可見,使用yield文法,一個類型要想可以使用foreach遍曆其子項目,只要滿足下面兩個條件之一即可:
1)有一個返回 IEnumerable 的方法,該方法內部是yield語句。
2)有一個public IEnumerator GetEnumerator() 簽名的方法,內部使用yield語句。
上述代碼之所以能那麼寫,是因為編譯器幫我們實現了我們沒有手動實現的條件。