列舉器和迭代器(一)
C#中的列舉器(enumerator)通俗的講是一個可以遞進式的訪問一個序列的指標(可能這並不恰當)。foreach語句(迭代語句)是我們比較熟悉的,例如順序輸入一個字串中的每個字元:
foreach (char c in "foreach")
{
Console.WriteLine(c);
}
在這裡foreach迭代的是一個字串,這裡的字串便是一個可列舉的物件,那麼什麼又是可列舉物件呢?可列舉物件實際上是一個可以返回一個列舉器的物件。這裡似乎有點繞,可能明確一下列舉器和可列舉物件的定義,會更容易理解。在C#中,一個物件只要實現IEnumerator或IEnumerator<T>
public interface IEnumerator
{
bool MoveNext();//用於迭代的方法
object Current { get; }//用於獲取當前元素的屬性
void Reset();//重置
}
IEnumerator<T>的定義是:
public interface IEnumerator<T> : IDisposable, IEnumerator
{
T Current { get; }
}
在IEnumerator介面中定義了一個用於迭代的方法,和一個用於獲取當前元素的屬性。
可列舉物件是一個實現了IEnumerable
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方法是用於返回一個列舉器的,可能是出於解偶和靈活性的考慮,如果把IEnumerator和IEnumerable合併到一起,我們理解可列舉物件可能會更容易,即一個列舉器又是一個可列舉物件,其實迭代器就是用於生成一個即是列舉器又是可列舉物件的。 (待續……)。