1.迭代器概念:
迭代器又称光标,时程序设计的软件设计模式。迭代器提供一个方法顺序访问一个聚合对象的各个元素,而不暴漏内部的标识。
在表象上看,在外部用foreach遍历对象而不需要了解其结构的,都是实现迭代器的。
2.标准迭代器的实现方法
关键接口:IEnumerator,IEnumerable。
命名空间:using System.Collections。
实现方式:同时继承IEnumerator和IEnumerable,实现其中的方法。
3.使用类实现迭代器
1.能用foreach遍历的类,必须提供IEnumerator对象,所以继承IEnumerable,实现IEnumerator GetEnumerator()方法。
2. 继承IEnumerable接口,实现 bool MoveNext()和 Reset()方法,继承object Current对象
3.forearch 本质
1.会先调用in后面对象的 GetEnumerator() 获取IEnumerator对象。
2.执行得到IEnumerator对象的MoveNext(),相当于移动光标到下一位,只要MoveNext()返回值为true,就会得到 Crrent对象,让后赋值给Item。
3.后面就会重复MoveNext(),直到得到返回值为false,就循环结束。
4.Reset(),会在1处初始化时,将重置光标位置。
5.代码实现:
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();
}
}
4.用yield return 语法糖实现迭代器
语法糖:将复杂逻辑简单化,增加程序的可读性,建设程序代码出错的机会。
实现过程:
只需要继承IEnumerable接口 实现GetIEnumerator()方法。
public class MyList2:IEnumerable
{
private int[] array;
public MyList2()
{
array = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
}
public IEnumerator GetEnumerator()
{
for (int i = 0; i < array.Length; i++)
{
yield return array[i];//等待下次回来 编译代码时 会自动补全相关代码
}
/*或者下面的
yield return array[0];
yield return array[1];
yield return array[2];
yield return array[3];
yield return array[4];...*/
}
}
5.用yield return 实现泛型迭代器
public class MyList3<T> : IEnumerable
{
private readonly T[] array;
public MyList3(T[] array)
{
this.array = array;
}
public IEnumerator GetEnumerator()
{
for (int i = 0; i < array.Length; i++)
{
yield return array[i];
}
}
}
public class Program
{
private static void Main(string[] args)
{
MyList3<string> myList = new MyList3<string>(new []{"1","2"});
foreach (var item in myList)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}