- 迭代器 能使你获得序列中所有元素而不用关心其类型是array,list,link list或者其他序列结构。
1,实现接口IEnumerable就可以实现数据迭代。其中调用GetEnumerator方法返回Enumerator接口的实现,就是迭代器本身。
class BookColletion:IEnumerable{ #region IEnumerable 成员 public IEnumerator GetEnumerator() { //return 一个IEnumerator对象 return new Enumerator(items); } private class Enumerator : IEnumerator { #region IEnumerator 成员 public Enumerator(object[] items) { elements = new object[items.Length]; Array.Copy(items,elements,items.Length); } public object Current { get { if(cursor>elements.Length-1){ throw new Exception("Enumeration already finished."); } if (cursor == -1) { throw new Exception("Enumeration not started."); } return elements[cursor]; } } public bool MoveNext() { ++cursor; if(cursor>(elements.Length-1)){ return false; } return true; } public void Reset() { cursor = -1; } #endregion private int cursor; private object[] elements = null; } #endregion public object[] items=null; } class Program { static void Main(string[] args) { BookColletion b = new BookColletion(); b.items = new object[] {"1","d","d"}; IEnumerator enumertor = b.GetEnumerator(); enumertor.MoveNext(); Console.Write(enumertor.Current); Console.Read(); } }
您只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动生成 IEnumerable 或 IEnumerable<T> 接口的 Current、MoveNext 和 Dispose 方法。
迭代器是可以返回相同类型的值的有序序列的一段代码。
迭代器可用作方法、运算符或 get 访问器的代码体。
迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。
可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}
迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。
yield实现简介迭代:
class Program { static void Main(string[] args) { //用数组实现输出 TheWeek week = new TheWeek(); for (int i = 0; i < week.weeks.Length;i++ ) { Console.Write(week.weeks[i]+" "); } DayofTheWeek dweek = new DayofTheWeek(); foreach(string x in dweek){ Console.Write(x); } Console.Read(); } } //迭代器 public class TheWeek { //为public; public string[] weeks ={ "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" }; } public class DayofTheWeek :IEnumerable{ private string[] weeks ={ "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" }; #region IEnumerable 成员 public IEnumerator GetEnumerator() { for (int i = 0; i < weeks.Length; i++) { yield return weeks[i]; } } #endregion }