解释.NET中的迭代器模式

迭代器模式用于遍历集合中的元素,并使用 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 + ".");

IEnumerable<T> 和 IEnumerator<T>

IEnumerator 和 IEnumerable 几乎总是与其扩展的通用版本一起实现 -

public interface IEnumerator<T> : IEnumerator, IDisposable{
   T Current { get; }
}
public interface IEnumerable<T> : IEnumerable{
   IEnumerator<T> GetEnumerator();
}