麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

11.C#迭代器(六章6.1)

2019-11-17 02:40:07
字體:
來源:轉載
供稿:網友

11.C#迭代器(六章6.1)

  今天我們說下C#中的迭代器,首先引出一些關于迭代的概念,后面舉出代碼供大家討論。

  迭代器模式是行為模式的一種范例,行為模式是一種簡化對象之間通信的一種設計模式。在.NET中使用IEnumerator和IEnumerable接口及它們的泛型等價物來封裝的,如果一個類型實現了IEnumerable接口,就說明它是可迭代的,調用GetEnumerator方法返回IEnumerator的實現,這是迭代器本身。

  C#1使用foreach語句實現了訪問迭代器的內置支持,foreach語句會被編譯成使用GetEnumerator和MoveNext方法以及Current屬性。C#中迭代器只能向后訪問,而C++中迭代器可以支持前后訪問。

  背景,假設有一個關于學生的隊列,每個學生依次報出自己的名字,Student類如下

 1 class Student 2 { 3     public string Name { get; set; } 4  5     public Student(string name) 6     { 7         Name = name; 8     } 9 10     public void SayName()11     {12         Console.WriteLine(Name);13     }14 }

  有一個實現IEnumerable的Queue的泛型類,如下

 1 class Queue<T> : IEnumerable<T> where T : class 2 { 3     public List<T> objects = new List<T>(); 4  5     public Queue(List<T> list) 6     { 7         objects = list; 8     } 9 10     //實現從IEnumerable中的GetEnumerator方法11     /*12         個人覺得這個方法在迭代中只會調用一次,不然每次都返回一個新的QueueIterator<T>對象,位置記錄都會重置為-113     */14     public IEnumerator<T> GetEnumerator()15     {16         return new QueueIterator<T>(this);  17     }18 19     IEnumerator IEnumerable.GetEnumerator()20     {21         throw new NotImplementedException();22     }23 }

  使用GetEnumerator方法返回一個迭代器,而迭代器需要實現IEnumerator接口,如下

 1 class QueueIterator<T> : IEnumerator<T> where T : class 2 { 3     PRivate ConsoleDemo.Chapter6.Queue<T> q = null; 4  5     int startPoint = -1;    //用于保存游標的位置 6  7     public QueueIterator(ConsoleDemo.Chapter6.Queue<T> q) 8     { 9         this.q = q;10     }11 12     //返回合適位置上的T類型實例,這個例子中調用提這個自動屬性13     public T Current14     {15         get16         {17             if (startPoint==-1 || startPoint==q.objects.Count)18             {19                 throw new InvalidOperationException();20             }21             int index = startPoint + q.objects.Count;22             index = index % q.objects.Count;23             return q.objects[index];24         }25     }26 27     object IEnumerator.Current28     {29         get30         {31             if (startPoint == -1 || startPoint == q.objects.Count)32             {33                 throw new InvalidOperationException();34             }35             int index = startPoint + q.objects.Count;36             index = index % q.objects.Count;37             return q.objects[index];38         }39     }40 41     public void Dispose()42     {43         44     }45 46     public bool MoveNext()47     {48         if (startPoint != q.objects.Count)49         {50             startPoint++;51         }52         return startPoint < q.objects.Count;53     }54     //當迭代結束后,會調用這個方法,則下一次迭代后重新從第一個位置開始55     public void Reset()56     {57         startPoint = -1;58     }59 }

  分別要去實現從IEnumerator中的Current屬性、Dispose方法(有必要的話)、MoveNext方法、Reset方法。使用C#2中的yield語句可以簡化迭代器,再下一篇中再說。

  請斧正。

  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 色综合视频 | 九一国产精品 | 99国产精品自拍 | 狠狠色噜噜狠狠狠米奇9999 | 亚洲国产成人久久一区www妖精 | 精品国产一区二区三区四 | 亚洲国产一区二区三区 | 久久草在线看 | 亚洲成人精品久久 | 一级做a在线观看 | 粉嫩一区 | 2021国产精品视频 | 88xx成人永久免费观看 | 成人午夜视频免费看 | 男男羞羞视频网站国产 | 今井夏帆av一区二区 | 日韩毛片网 | 91精品久久久久久久久网影视 | 亚洲免费网站 | 毛片免费在线播放 | 一区二区三区视频在线观看 | 九九热视频在线 | 精品国产99久久久久久宅男i | 国产一区二区三区在线观看视频 | 天天天干夜夜夜操 | 久夜草| 91精品国产综合久久婷婷香 | 成人短视频在线观看 | 九九热九九爱 | 中文字幕综合在线观看 | 久精品久久 | 国产色片在线观看 | 播色网 | 久久手机在线视频 | 久久久精品网站 | 成人毛片网站 | 亚洲精品欧美二区三区中文字幕 | 国产成人精品免费视频大全最热 | av影院在线播放 | 最新亚洲视频 | 91精品免费在线 |