2023-03-24
设计模式
00
请注意,本文编写于 666 天前,最后修改于 666 天前,其中某些信息可能已经过时。

目录

引言
迭代器实现
结论

引言

迭代器模式是一种行为型设计模式,它允许按照特定顺序遍历集合对象的元素,同时不暴露集合的内部结构。这样做可以让客户端代码不依赖于集合对象的具体实现,从而提高代码的灵活性和可重用性。

在迭代器模式中,聚合对象将其遍历的职责委托给迭代器对象,而不是在聚合对象中实现遍历。

迭代器模式的优点是可以支持以不同的方式遍历一个聚合对象,而且可以隐藏遍历元素的内部细节。

在 C# 中,迭代器模式可以通过实现IEnumerableIEnumerator接口来实现。其中 IEnumerable接口定义了一个GetEnumerator方法,返回一个实现了IEnumerator接口的迭代器对象。IEnumerator接口则定义了访问集合中元素的方法,包括CurrentMoveNextReset等。

迭代器实现

csharp
public class MyCollection : IEnumerable { private int[] items = new int[5] { 31, 12, 3, 64, 51 }; // 实现 IEnumerable 接口,返回一个枚举器 public IEnumerator GetEnumerator() { return new MyEnumerator(items); } // 自定义迭代器类 private class MyEnumerator : IEnumerator { private int[] items; private int position = -1; public MyEnumerator(int[] items) { this.items = items; } public object Current { get { if (position >= 0 && position < items.Length) { return items[position]; } else { throw new InvalidOperationException(); } } } public bool MoveNext() { position++; return (position < items.Length); } public void Reset() { position = -1; } } }

这样我们可以直接使用foreach进行遍历:

csharp
MyCollection collection = new MyCollection(); foreach (int item in collection) { Console.WriteLine(item); }

输出结果

csharp
31 12 3 64 51

结论

这就是迭代器模式的基本用法。它可以让我们轻松地遍历集合对象中的元素,而不必暴露集合的内部结构。此外,通过实现IEnumerableIEnumerator接口,我们可以轻松地在 C# 中实现迭代器模式。

提示

foreach是c#语法糖,用来遍历实现了IEnumerable接口的集合类。

foreach 循环的原理是通过调用集合类的GetEnumerator方法,返回一个实现了IEnumerator接口的迭代器对象,然后通过迭代器对象的MoveNext方法,依次访问集合中的每个元素,直到集合中的所有元素都被访问完毕。

本文作者:Peter.Pan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!