迭代器
迭代器概念:
迭代器又称光标,是程序设计的软件设计模式。迭代器提供一个方法顺序访问一个聚合对象的各个元素,而不暴漏内部的标识。
在表象上看,在外部用foreach遍历对象而不需要了解其结构的,都是实现迭代器的。
标准迭代器的实现方法
关键接口:IEnumerator,IEnumerable。
命名空间:using System.Collections。
实现方式:同时继承IEnumerator和IEnumerable,实现其中的方法。
使用类实现迭代器
- 能用foreach遍历的类,必须提供IEnumerator对象,所以继承IEnumerable,实现IEnumerator GetEnumerator()方法。
- 继承IEnumerable接口,实现 bool MoveNext()和 Reset()方法,继承object Current对象
- forearch 本质
1. 会先调用IEnumerator对象的 GetEnumerator() 获取IEnumerator对象。
2. 执行得到IEnumerator对象的MoveNext(),相当于移动光标到下一位,只要MoveNext()返回值为true,就会得到 Crrent对象,让后赋值给Item。
3. 后面就会重复MoveNext(),直到得到返回值为false,就循环结束。
4. Reset(),会在1处初始化时,将重置光标位置。
代码实现:
public class MyList : IEnumerable, IEnumerator
{
private readonly int[] array;
private int index = -1;
public object Current => array[index];
public MyList()
{
array = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
}
public IEnumerator GetEnumerator()
{
Reset();//每次foreach 都会调用一次GetEnumerator
return this;
}
public bool MoveNext()//移动光标
{
if (index >= array.Length-1)
return false;
index++;
return true;
}
public void Reset()
{
index = -1;//重置光标位置
}
}
public class Program
{
private static void Main(string[] args)
{
MyList myList = new MyList();
foreach (var item in myList)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}