解释 .NET 中的迭代器模式


迭代器模式用于循环遍历集合中的元素,并使用 IEnumerator 接口实现。它定义了遍历(或枚举)集合中的元素的基本底层协议。这是以单向的方式完成的。

以下是 C# 中的 IEnumerator 接口。

public interface IEnumerator{
   bool MoveNext();
   object Current { get; }
   void Reset();
}
  • **MoveNext** 将当前元素或“游标”推进到下一个位置,如果集合中没有更多元素,则返回 false。

  • Current 返回当前位置的元素(通常从 object 转换为更具体的类型)。在检索第一个元素之前必须调用 **MoveNext**——这是为了允许空集合。

  • 如果实现了 **Reset** 方法,则会返回到开头,允许再次枚举集合。

集合通常不实现枚举器;而是通过 IEnumerable 接口提供枚举器−

public interface IEnumerable{
   IEnumerator GetEnumerator();
}

此接口定义了一个返回枚举器的方法。这提供了灵活性,因为迭代逻辑可以传递给另一个类。这也意味着多个使用者可以同时枚举集合,而不会相互干扰。您可以将 IEnumerable 视为“IEnumeratorProvider”,它是集合类实现的最基本接口。

以下示例说明了 IEnumerable 和 IEnumerator 的底层用法−

示例

string s = "Hello";
// Because string implements IEnumerable, we can call 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"; // The String class implements 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();
}

更新于: 2021年5月19日

280 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告