枚举器和迭代器(一)

 

C#中的枚举器(enumerator)通俗的讲是一个可以递进式的访问一个序列的指针(可能这并不恰当)foreach语句(迭代语句)是我们比较熟悉的,例如顺序输入一个字符串中的每个字符:

foreach (char c in "foreach")

            {

                Console.WriteLine(c);

            }

在这里foreach迭代的是一个字符串,这里的字符串便是一个可枚举的对象,那么什么又是可枚举对象呢?可枚举对象实际上是一个可以返回一个枚举器的对象。这里似乎有点绕,可能明确一下枚举器和可枚举对象的定义,会更容易理解。在C#中,一个对象只要实现IEnumeratorIEnumerator接口,那么这个对象就是一个枚举器。IEnumerator的定义是:

public interface IEnumerator

    {

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

        object Current { get; }//用于获取当前元素的属性

        void Reset();//重置

}

IEnumerator的定义是:

public interface IEnumerator : IDisposable, IEnumerator

    {

        T Current { get; }

}

IEnumerator接口中定义了一个用于迭代的方法,和一个用于获取当前元素的属性。

可枚举对象是一个实现了IEnumerableIEnumerable的对象,他们的定义分别是:

public interface IEnumerable

    {

        IEnumerator GetEnumerator();

}

public interface IEnumerable : IEnumerable

    {

        IEnumerator GetEnumerator();

}

foreach为我们操作可枚举对象提供了方便如果没有foreach我们可能需要这样去迭代一个对象:

CharEnumerator charEnumeartor = "foreach".GetEnumerator();

    while (charEnumeartor.MoveNext())

    {

        char c = charEnumeartor.Current;

        Console.WriteLine(c);

}

看起来很麻烦,哈哈。

可枚举对象接口中的GetEnumerator方法是用于返回一个枚举器的,可能是出于解偶和灵活性的考虑,如果把IEnumeratorIEnumerable合并到一起,我们理解可枚举对象可能会更容易,即一个枚举器又是一个可枚举对象,其实迭代器就是用于生成一个即是枚举器又是可枚举对象的。 (待续……)

 

你可能感兴趣的:(C#)