- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Collections;
- public class MyCollection : IEnumerable
- {
- public int[] items;
- public MyCollection()
- {
- items = new int[5] { 12, 44, 33, 2, 50 };
- }
- //public IEnumerator GetEnumerator()
- //{
- // return new MyEnumerator(this);
- //}
- //c#2.0后的实现方式
- public IEnumerator GetEnumerator()
- {
- for (int i = 0; i < items.Length; i++)
- {
- yield return items[i];
- }
- }
- }
- public class MyEnumerator : IEnumerator
- {
- int nIndex;
- MyCollection collection;
- public MyEnumerator(MyCollection coll)
- {
- collection = coll;
- nIndex = -1;
- }
- public bool MoveNext()
- {
- nIndex++;
- return (nIndex < collection.items.GetLength(0));
- }
- public object Current
- {
- get
- {
- return (collection.items[nIndex]);
- }
- }
- public void Reset()
- {
- nIndex = -1;
- }
- }
- public class MainClass
- {
- public static void Main()
- {
- MyCollection col = new MyCollection();
- foreach (int i in col)
- {
- Console.WriteLine(i);
- }
- Console.WriteLine("-----------------------");
- //完全抽象于(不依赖于)具休集合结构的访问操作
- IEnumerator ietor = col.GetEnumerator();
- while (ietor.MoveNext())
- {
- int i = (int)ietor.Current;
- Console.WriteLine(i);
- }
- Console.ReadKey();
- }
- }
在软件构建过程中,集合对象内部结构常常变化各 异。但对于这些集合对象,我们希望在不暴露其内 部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算 法在多种集合对象上进行操作”提供了可。
使用面向对象技术将这种遍历机制抽象为“迭代器 对象”为“应对变化中的集合对象”提供了一种优雅的方式。
意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
Iterator模式的几个要点
* 迭代抽象:访问一个聚合对象的内容而无 需暴露它的内部表示。
* 迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
* 迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。