1. 程式人生 > >列舉器和迭代器(一)

列舉器和迭代器(一)

C#中的列舉器(enumerator)通俗的講是一個可以遞進式的訪問一個序列的指標(可能這並不恰當)foreach語句(迭代語句)是我們比較熟悉的,例如順序輸入一個字串中的每個字元:

foreach (char c in "foreach")

{

Console.WriteLine(c);

}

在這裡foreach迭代的是一個字串,這裡的字串便是一個可列舉的物件,那麼什麼又是可列舉物件呢?可列舉物件實際上是一個可以返回一個列舉器的物件。這裡似乎有點繞,可能明確一下列舉器和可列舉物件的定義,會更容易理解。在C#中,一個物件只要實現IEnumeratorIEnumerator<T>

介面,那麼這個物件就是一個列舉器。IEnumerator的定義是:

public interface IEnumerator

{

bool MoveNext();//用於迭代的方法

object Current { get; }//用於獲取當前元素的屬性

void Reset();//重置

}

IEnumerator<T>的定義是:

public interface IEnumerator<T> : IDisposable, IEnumerator

{

T Current { get; }

}

IEnumerator介面中定義了一個用於迭代的方法,和一個用於獲取當前元素的屬性。

可列舉物件是一個實現了IEnumerable

IEnumerable<T>的物件,他們的定義分別是:

public interface IEnumerable

{

IEnumerator GetEnumerator();

}

public interface IEnumerable<T> : IEnumerable

{

IEnumerator<T> GetEnumerator();

}

foreach為我們操作可列舉物件提供了方便如果沒有foreach我們可能需要這樣去迭代一個物件:

CharEnumerator charEnumeartor = "foreach".GetEnumerator();

while (charEnumeartor.MoveNext())

{

char c = charEnumeartor.Current;

Console.WriteLine(c);

}

看起來很麻煩,哈哈。

可列舉物件介面中的GetEnumerator方法是用於返回一個列舉器的,可能是出於解偶和靈活性的考慮,如果把IEnumeratorIEnumerable合併到一起,我們理解可列舉物件可能會更容易,即一個列舉器又是一個可列舉物件,其實迭代器就是用於生成一個即是列舉器又是可列舉物件的。 (待續……)