迭代器模式用于遍历集合中的元素,并使用 IEnumerator 接口实现。它定义了基本的低级协议,通过该协议遍历或枚举集合中的元素。这是以只进的方式完成的。
这是 C# 中的 IEnumerator 接口。
public interface IEnumerator{ bool MoveNext(); object Current { get; } void Reset(); }
MoveNext将当前元素或“光标”移动到下一个位置,如果集合中没有更多元素,则返回 false。
Current 返回当前位置的元素(通常从对象转换为更具体的类型)。MoveNext必须在检索第一个元素之前调用——这是为了允许一个空集合。
该复位方法,如果实现的话,移回开始,允许集合再次列举。
集合通常不实现枚举器;相反,他们通过接口 IEnumerable提供枚举器 -
public interface IEnumerable{ IEnumerator GetEnumerator(); }
该接口定义了一个返回枚举器的方法。这提供了灵活性,因为可以将迭代逻辑移交给另一个类。这也意味着多个使用者可以一次枚举集合而不会相互干扰。您可以将 IEnumerable 视为“IEnumeratorProvider”,它是集合类实现的最基本的接口。
以下示例说明了 IEnumerable 和 IEnumerator 的低级使用 -
string s = "Hello"; // 因为string实现了IEnumerable,我们可以调用GetEnumerator(): IEnumerator rator = s.GetEnumerator(); while (rator.MoveNext()){ char c = (char) rator.Current; Console.Write (c + "."); }输出结果
H.e.l.l.o.
但是,很少以这种方式直接调用枚举器上的方法,因为 C# 提供了一种语法快捷方式:foreach 语句。这是使用foreach重写的相同示例-
string s = "Hello"; // String 类实现了 IEnumerable foreach (char c in s) Console.Write (c + ".");
IEnumerator 和 IEnumerable 几乎总是与其扩展的通用版本一起实现 -
public interface IEnumerator<T> : IEnumerator, IDisposable{ T Current { get; } } public interface IEnumerable<T> : IEnumerable{ IEnumerator<T> GetEnumerator(); }