1. 程式人生 > >C# 入門(14) 列舉器(enumerator)和迭代器(iterator)

C# 入門(14) 列舉器(enumerator)和迭代器(iterator)

C#的列舉器和迭代器

  
  列舉器一般用來foreach的,而迭代器在Unity中常用來當協程(Coroutine)用。

列舉器

IEnumerator介面

  實現IEnumerator介面的類就可以foreach了,當然前提是實現對。這個介面有三個函式成員。
  

  • Current
    • 只讀。
    • 返回object型別的引用。
    • 第一次的位置在-1,所以算是溢位了。
  • MoveNext
    • 把列舉器位置指向下一項。
    • 返回bool。判斷是否新的位置有效。
    • 第一次用要在Current前。
  • Reset
    • 把位置重置到原始狀態。

foreach做的事跟下面這段程式碼差不多。

static void Main()
{
    int[] MyArray = {10,11,12,13};

    IEnumerator ie = MyArray.GetEnumerator();    //獲取列舉器

    while(ie.MoveNext())                         //移到下一項
    {
        int i =(int) ie.Current;                 //獲取當前項
        Console.WriteLine("{0}",i);
    }
}

IEnumerable介面

  只有一個成員,GetEnumerator方法,就是實現上面那個介面的類物件。

應該使用泛型列舉介面

  因為非泛型的實現是不安全的,它們返回object的引用,需要自己轉換成實際型別。如上面的程式碼int i = (int) ie.Current;,是不安全的。而實現泛型的Current屬性,就會返回實際型別的物件。

迭代器

  • yield return語句指定了序列中返回的下一項。
  • yield break語句指定到序列中最尾端,就是像真正的return一樣。

常見迭代模式

常見迭代模式

迭代器實質

迭代器實質

狀態 解釋
Before 第一次迭代前
Running 搞事情
Suspended 等下一次迭代
After 賢者模式