解释 .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(); }
广告