赞
踩
迭代器(iterator) 又称光标(cursor)
是程序设计的软件设计模式
迭代器提供一个方法顺序访问一个聚合对象中的各个元素
而又不暴露其内部的标识
在表现效果上看
是可以在容器对象(例如链表或数组)上遍历访问的接口
设计人员无需关心容器对象的内存分配的实现细节
可以用foreach遍历的类,都是实现了迭代器的
继承IEnumerable, IEnumerator using System.Collections; CustomList lists = new CustomList(); //foreach本质 //1、先获取in后面这个对象的IEnumerator //会调用对象其中的GetEnumerator方法来获取 //2、执行得到这个IEnumerator对象中的MoveNext方法 //3、只要MoveNext方法的返回值是true,就会去得到Current //然后赋值给item foreach (var item in lists) { Console.WriteLine(item); } class CustomList : IEnumerable, IEnumerator { private int position = -1; private int[] list; public CustomList() { list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; } public object Current { get { return list[position]; } } public IEnumerator GetEnumerator() { Reset(); return this; } public bool MoveNext() { position++; return position < list.Length; } //reset重置光标位置,写在IEnumerator中 public void Reset() { position = -1; } }
yield return 是C#提供的语法糖 语法糖主要作用就是将复杂逻辑简单化,可以增加程序的可读性 CustomList list = new CustomList(); foreach (var item in list) { Console.WriteLine(item); } class CustomList : IEnumerable { private int[] list; public CustomList() { list = new int[] { 1, 2, 3 }; } public IEnumerator GetEnumerator() { for (int i = 0; i < list.Length; i++) { //配合迭代器使用 yield return list[i]; } } }
CustomList<string> array = new CustomList<string>("aaa","bbb","ccc"); foreach (var item in array) { Console.WriteLine(item); } class CustomList<T> : 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]; } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。