迭代器
Contents
迭代器
- 迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式
- 而迭代器模式提供一个方法顺序 访问一个聚合对象中的各个元素 而又不暴露其内部的标识
- 是可以在容器对象上遍历访问的接口 设计人员无需关心容器对象的内存分配的实现细节
- 可以用foreach遍历的类 都是实现了迭代器的
标准迭代器的实现方法
- 可通过实现IEnumerator和IEnumerable这两个接口 来实现迭代器
- 需要引用命名空间 System.Collections
class CustomList : IEumerable,IEnumerator{
private int[] list;
private int index = -1;
public CustomList(){
list = {1,2,3,4,5,6,7,8,9};
}
//只要实现了IEumerable接口 Foreach就不会报错
public IEnumerator GetEnumerator(){
Reset();
return this;
}
//IEnumerator接口的方法
//代表当前的元素
public object Current => list[index];
public void Reset(){
index = -1;
}
public bool MoveNext(){
index++;
return lsit.Length>index;
}
}foreach本质
- 先调用in后面这个对象里面 通过IEumerable接口实现的GetEnumerator方法
- 执行得到的IEnumerator对象中的MoveNext方法
- 只要MoveNext方法的返回值是true 就会去得到Current 赋值给item
- 遍历结束后会调用Reset方法 重置index
foreach(var item in CustomList){
Console.WriteLine(item);//1 2 3 4 5 6 7 8 9
}通过语法糖来实现迭代器
- 语法糖的主要作用 就是将复杂逻辑简单化,可以增加程序的可读性
- 程序内部会自动生成IEnumerator
class CustomList : IEumerable{
private int[] list;
private int index = -1;
public CustomList(){
list = {1,2,3,4,5,6,7,8,9};
}
//只要实现了IEumerable接口 Foreach就不会报错
public IEnumerator GetEnumerator(){
for(int i =0;i<list.Length;i++){
//yield关键字 配合迭代器使用的
//可以理解为 暂时返回 保留当前状态
//C#语法糖
yield return list[i];
}
}
}