迭代器是什么
- 迭代器(iterator) 有时又称光标(cursor)
- 是程序设计的软件设计模式
- 迭代器模式提供一个方法顺序访问一个聚 合对象中的各个元素而又不暴露其内部的标识
在表现效果上看
- 是可以在容器对象(例如链表或数组)_上 遍历访问的接口
- 设计人员无需关心容器对象的内存分配的实现细节
- 可以用foreach遍历的类,都是实现了迭代器的
标准迭代器的实现方法
#region 标准迭代器的实现方法
//关键接口口: IEnumerator,IEnumerable
//命名空间: using System . Collections;
//可以通过同时继承IEnumerable和IEnumerator实现其中的方法
class CustomList : IEnumerable, IEnumerator
{
private int[] list;
//从-1开始的光标 用于表示 数据得到了那个位置
private int index = -1;
public CustomList() { list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; }
#region IEnumerator
public IEnumerator GetEnumerator(){ return this; }
#endregion
#region IEnumerable
public object Current{get{return list[index]; } }
public bool MoveNext()
{
index++;
return index < list.Length;
}
public void Reset()
{
index = -1;
}
#endregion
}
#endregion
static void Main(string[] args)
{
CustomList list = new CustomList();
//foreach本质
//1.先获取in后面这个对象的IEnumerator
// 会调用对象其中的GetEnumerator方法来获取
//2.执行得到这个IEnumerator对象中的MoveNext方法
//3.只要MoveNext方法的返回值时true就会去得到Current
// 然后复制给item
foreach (int item in list)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
用yield return语法糖实现迭代器
#region 用yield return语法糖实现迭代器
//yield return 是C#提供给我们的语法糖
//所谓语法糖,也称糖衣语法
//主要作用就是将复杂逻辑简单化,可以增加程序的可读性
//从而减少程序代码出错的机会
//关键接口: IEnumerable
//命名空间: using system. Collections ;
//让想要通过foreach遍历的自定义类实现接口中的方法GetEnumerator即可
class CustomList2 : IEnumerable
{
private int[] list;
public CustomList2() { list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; }
public IEnumerator GetEnumerator()
{
for (int i = 0; i < list.Length; i++)
{
//yield关键字配合迭代器使用
//可以理解为暂时返回保留当前的状态
yield return list[i];
}
}
}
#endregion
用yieldreturn语法糖为泛型类实现迭代器
#region 用yieldreturn语法糖为泛型类实现迭代器
class CustomList<T> : IEnumerable
{
private T[] array;
public IEnumerator GetEnumerator()
{
for (int i = 0; i < array.Length; i++)
{
yield return array[i];
}
}
}
#endregion