一、迭代器迭代器iterator有时又称光标cursor是程序设计的软件设计模式迭代器模式提供一个方法顺序访问一个聚合对象中的各个元素而又不暴露其内部的标识二 标准迭代器的实现方法关键接口IEnumerator,IEnumerable命名空间using System.Collections;可以通过同时继承IEnumerable和IEnumerator实现其中的方法IEnumerable表示一个可被遍历的集合如数组、列表、字典等GetEnumerator()返回一个IEnumerator对象。实现该接口的类可以用于foreach循环。IEnumerator表示遍历过程中的“游标”记录当前遍历位置并提供移动下一个、获取当前元素的能力。核心成员object Current获取当前位置的元素。bool MoveNext()将游标移到下一个元素如果成功返回true到达末尾返回false。void Reset()将游标重置到初始位置位于第一个元素之前。class CustomList : IEnumerable, IEnumerator { private int[] list; //从-1开始的光标 用于表示 数据得到了哪个位置 private int position -1; public CustomList() { list new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; } #region IEnumerable public IEnumerator GetEnumerator() { Reset(); return this; } #endregion public object Current { get { return list[position]; } } public bool MoveNext() { //移动光标 position; //是否溢出 溢出就不合法 return position list.Length; } //reset是重置光标位置 一般写在获取 IEnumerator对象这个函数中 //用于第一次重置光标位置 public void Reset() { position -1; } }三 用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关键字 配合迭代器使用 可以理解为 暂时返回 保留当前的状态 一会还会在回来 C#的语法糖 yield return list[i]; } yield return list[7]; } }四、用yield return 语法糖为泛型类实现迭代器class CustomListT : IEnumerable { private T[] array; public CustomList(params T[] array) { this.array array; } public IEnumerator GetEnumerator() { for (int i 0; i array.Length; i) { yield return array[i]; } }五 foreach的本质foreach本质1.先获取in后面这个对象的 IEnumerator会调用对象其中的GetEnumerator方法 来获取2.执行得到这个IEnumerator对象中的 MoveNext方法3.只要MoveNext方法的返回值时true 就会去得到Current然后复制给 itemforeach (int item in list) { Console.WriteLine(item); } foreach (int item in list) { Console.WriteLine(item); }