C# 中已经实现了迭代器功能, foreach in 和 IEnumerable 和 IEumerator 接口 是为迭代器而准备的。 所以在实用性上已经没有了。
重点概念
1.提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
2.当访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。
3.遍历的方式可以从头到尾,也可以从尾到头的选择。
4.为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
5. 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
6.
7.
8.
示例代码
历史实现迭代器
using System; using System.Collections.Generic; using System.Text; namespace 迭代器模式 { class Program { static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); a[0] = "大鸟"; a[1] = "小菜"; a[2] = "行李"; a[3] = "老外"; a[4] = "公交内部员工"; a[5] = "小偷"; Iterator i = new ConcreteIterator(a); //Iterator i = new ConcreteIteratorDesc(a); object item = i.First(); while (!i.IsDone()) { Console.WriteLine("{0} 请买车票!", i.CurrentItem()); i.Next(); } Console.Read(); } } abstract class Aggregate { public abstract Iterator CreateIterator(); } class ConcreteAggregate : Aggregate { private IList<object> items = new List<object>(); public override Iterator CreateIterator() { return new ConcreteIterator(this); } public int Count { get { return items.Count; } } public object this[int index] { get { return items[index]; } set { items.Insert(index, value); } } } abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); } class ConcreteIterator : Iterator { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; } public override object First() { return aggregate[0]; } public override object Next() { object ret = null; current++; if (current < aggregate.Count) { ret = aggregate[current]; } return ret; } public override object CurrentItem() { return aggregate[current]; } public override bool IsDone() { return current >= aggregate.Count ? true : false; } } class ConcreteIteratorDesc : Iterator { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIteratorDesc(ConcreteAggregate aggregate) { this.aggregate = aggregate; current = aggregate.Count - 1; } public override object First() { return aggregate[aggregate.Count - 1]; } public override object Next() { object ret = null; current--; if (current >= 0) { ret = aggregate[current]; } return ret; } public override object CurrentItem() { return aggregate[current]; } public override bool IsDone() { return current < 0 ? true : false; } } }
迭代器的.Net 实现
using System; using System.Collections.Generic; using System.Text; namespace 迭代器模式 { class Program { static void Main(string[] args) { IList<string> a = new List<string>(); a.Add("大鸟"); a.Add("小菜"); a.Add("行李"); a.Add("老外"); a.Add("公交内部员工"); a.Add("小偷"); foreach (string item in a) { Console.WriteLine("{0} 请买车票!", item); } //上面 Foreach in 所实现的操作如下 IEnumerator<string> e = a.GetEnumerator(); while (e.MoveNext()) { Console.WriteLine("{0} 请买车票!", e.Current); } Console.Read(); } } }
冯瑞涛