枚举器和迭代器
大约 2 分钟
枚举器和迭代器
枚举器
可枚举类型(IEnumerable )
在.NET中满足以下任意条件的都是可枚举类型:
实现了 System.Collections.IEnumerable 接口
实现了 System.Collections.Generic.IEnumerable 接口
有一个名为 GetEnumerator 的公共无参数方法,它返回一个枚举器
可枚举类型的作用
- 统一数据的取出方式,使用枚举器对数据进行封装
枚举器(Enumerator)
- 在.NET中满足以下任意条件的都是枚举器:
- 实现了 System.Collections.IEnumerator 接口
- 实现了 System.Collections.Generic.IEnumerator 接口
- 有一个名为 MoveNext 的公共无参数方法和名为 Current 的属性
- public bool MoveNext(){...} // 把枚举器位置前进到下一个位置
- Current : 返回序列中当前位置项的属性;
- 枚举器的初始位置在第一项之前,MoveNext必须在第一次使用Current前调用;
使用可枚举类型
// 定义数据类
public class Student{}
// 定义枚举器
public class StudentIEnumerator:IEnumerator<Student>{}
// 定义可枚举类型
public class StudentCollection:IEnumerable<Student>{}
var studentCollection = new StudentCollection();
// 使用 foreach 遍历
foreach(var student in studentCollection)
{
...
}
// 使用迭代器遍历
var enumerator = studentCollection.GentEnumertor();
while(enumerator.MoveNext())
{
var student = enumerator.CUrrent;
...
}
迭代器
迭代器是程序设计的软件设计模式,提供了一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的标识
实现方式:
同时继承 IEnumerable 和 IEnumerator 接口
用 yield return 语法
class StudentCollection:IEnumerable { private Student[] list; public StudentCollection(params Student[] list) { this.list = list } public IEnumerator GetEnumerator() { for(var i = 0 ; i<list.Length;i++) yield return list[i] } }
迭代器的作用:
利用迭代器可以创建枚举器和可枚举类型
利用迭代器创建多个可枚举类型, “对象名.迭代器名”使用不同的可枚举类型;
类可以创建多个可枚举类型,但类本身不一定是可枚举类,类本身是否属于可枚举类取决于其是否实现了GetEnumerator;