1.代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lesson23_Iterator
{
class Program
{
#region 一、迭代器是什么
// 迭代器模式 提供一个方法顺序访问一个聚合对象中的 各个元素
// 可以使用foreach遍历的类,都实现了迭代器
#endregion
#region 二、标准迭代器需要实现什么
// 关键接口:IEnumerable,
// 命名空间:using System.Collections;
class MyList : IEnumerable, IEnumerator
{
private int[] list;
private int cursor = -1;
public MyList()
{
list = new int[] { 1, 2, 3, 4};
}
// foreach 本质
// 1.调用 GetEnumerator 方法 获取
// 2.调用 MoveNext()
// 3.MoveNext() 返回true 获取到 Current
// 再次MoveNext()
// 如果返回 False 结束 并调用 Reset()
#region IEnumerable
public IEnumerator GetEnumerator()
{
// 第一次光标位置
Reset();
// 返回自己的对象
return this;
}
#endregion
#region IEnumerator
// 返回 聚合中的 对象
public object Current
{
get
{
return list[cursor];
}
}
// 移动光标
public bool MoveNext()
{
// 移动光标
++cursor;
// 溢出则不合法
return cursor < list.Length;
}
// 重置光标
public void Reset()
{
cursor=-1;
}
#endregion
}
#endregion
#region 三、使用yield return 实现迭代器
// 1.继承 IEnumerable 一个接口
// 2. 使用 yield return 返回item即可
class CustomList : IEnumerable
{
private int[] list;
public CustomList()
{
this.list = new int[] {5, 6, 7, 8 };
}
public IEnumerator GetEnumerator()
{
for (int i = 0; i < list.Length; i++)
{
// 语法糖 编译后具体实现为 传统方式
yield return this.list[i];
}
}
}
#region 四、泛型迭代器
// 1.继承 IEnumerable 一个接口
// 2. 使用 yield return 返回item即可
class TempleList<T> : IEnumerable
{
private T[] arry;
public TempleList(params T[] arry)
{
this.arry = arry;
}
public IEnumerator GetEnumerator()
{
for (int i = 0; i < this.arry.Length; i++)
{
yield return this.arry[i];
}
}
}
#endregion
#endregion
static void Main(string[] args)
{
Console.WriteLine("=========迭代器===========");
MyList mylist = new MyList();
Console.WriteLine("=========1.传统实现===========");
foreach (int item in mylist)
{
Console.WriteLine(item);
}
Console.WriteLine("=========2.yield 实现===========");
CustomList customList = new CustomList();
foreach (int item in customList)
{
Console.WriteLine(item);
}
Console.WriteLine("=========3.yield 实现泛型迭代器===========");
TempleList<string> tempList = new TempleList<string>("AAA", "BBB", "CCC");
foreach (var item in tempList)
{
Console.WriteLine(item);
}
// 总结
// 迭代器就是 可以直接通过 foreach 遍历对象,而不需要了解内部结果
// 主要的实现方式有:
// 1.传统方法 继承两个接口IEnumerable, IEnumerator
// 2.yield return 方式实现 继承 IEnumerable
Console.ReadLine();
}
}
}