av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

C#Iterator迭代器模式

C# Iterator迭代器模式我們?cè)谄綍r(shí)的開(kāi)發(fā)中應(yīng)該經(jīng)常用到。不直接使用也會(huì)間接使用,我們使用foreach語(yǔ)句來(lái)循環(huán)就是在間接的使用C# Iterator迭代器模式。

迭代器就像指針一樣可以向前向后移動(dòng),在.NET中迭代器只能向后移動(dòng)。

動(dòng)機(jī):在軟件的構(gòu)建過(guò)程中,集合對(duì)象內(nèi)部結(jié)構(gòu)常常變化各異。但對(duì)于這些集合對(duì)象,我們希望在不暴露其內(nèi)部結(jié)構(gòu)的同時(shí),可以讓外部客戶代碼透明地訪問(wèn)其中包含的元素;同時(shí)這種“透明遍歷”也為“同一種算法在多種集合對(duì)象上進(jìn)行操作”提供了可能。使用面向?qū)ο蠹夹g(shù)將這種遍歷機(jī)制抽象為“迭代器對(duì)象”為“應(yīng)對(duì)變化中的集合對(duì)象”提供了一種優(yōu)雅的方式。

意圖:提供一種方法順序訪問(wèn)一個(gè)集合對(duì)象中的各個(gè)元素,而不暴露該對(duì)象的內(nèi)部表示。

 
 
 
  1. public interface IEnumerable{  
  2. //得到迭代器  
  3. IEnumerator GetEnumerator();  
  4. }  
  5. ///  
  6. /// 迭代器接口  
  7. ///  summary> 
  8. public interface IEnumerator{  
  9. //得到當(dāng)前的對(duì)象  
  10. object Current{  
  11. get;  
  12. }  
  13. bool MoveNext();  
  14. void Reset();  
  15. }  
  16. ///  
  17. /// 集合類(lèi)型,實(shí)現(xiàn)了可迭代接口  
  18. ///  summary> 
  19. public class MyCollection : IEnumerable{  
  20. internal int[] items;  
  21. public MyCollection(){  
  22. items = new int[5] {1, 2, 3, 4, 5};  
  23. }  
  24. #region IEnumerable 成員  
  25. //實(shí)現(xiàn)迭代接口,返回迭代器  
  26. public IEnumerator GetEnumerator(){  
  27. //在這里進(jìn)行解藕,將集合對(duì)象轉(zhuǎn)換為迭代器  
  28. return new MyEnumerator(this);  
  29. }  
  30. #endregion  
  31. }  
  32. //迭代器對(duì)象,實(shí)現(xiàn)了迭代器接口  
  33. internal class MyEnumerator : IEnumerator{  
  34. private int nIndex;  
  35. MyCollection collection;   
  36. //構(gòu)造函數(shù)將集合類(lèi)型轉(zhuǎn)換成內(nèi)部成員  
  37. public MyEnumerator(MyCollection coll){  
  38. this.collection = coll;  
  39. nIndex = -1;  
  40. }  
  41. #region IEnumerator 成員  
  42. //返回當(dāng)前迭代到的對(duì)象  
  43. public object Current{  
  44. get{  
  45. return collection.items[nIndex];  
  46. }  
  47. }  
  48. //移動(dòng)到下一個(gè)對(duì)象,指針向后移動(dòng)  
  49. public bool MoveNext(){  
  50. nIndex++;  
  51. return (nIndex < collection.items.GetLength(0));  
  52. }  
  53. //重設(shè)迭代器,指針回零  
  54. public void Reset(){  
  55. nIndex = -1;  
  56. }  
  57. #endregion  
  58. }  

很清楚,在上面的代碼中,我們通過(guò)GetEnumerator方法,將集合對(duì)象轉(zhuǎn)換為了可迭代對(duì)象,這實(shí)際上是在對(duì)集合對(duì)象進(jìn)行抽象,將他轉(zhuǎn)換為迭代器。在這里,我們需要定義一個(gè)迭代器類(lèi),但是這是.NET 1.1中的做法,在.NET 2.0以后實(shí)現(xiàn)一個(gè)可迭代模式更加簡(jiǎn)單。

 
 
 
  1. ///  
  2. /// 集合類(lèi)型,實(shí)現(xiàn)了可迭代接口  
  3. ///  summary> 
  4. public class MyCollection : IEnumerable 
  5. {  
  6. internal int[] items;  
  7.  
  8. public MyCollection()  
  9. {  
  10. items = new int[5] {1, 2, 3, 4, 5};  
  11. }  
  12.  
  13. #region IEnumerable 成員  
  14.  
  15. public IEnumerator GetEnumerator()  
  16. {  
  17. for(int i = 0; i < items.Length; i++)  
  18. {  
  19. yield return items[i];  
  20. }  
  21. }  
  22. #endregion  
  23.  
  24. #region IEnumerable 成員  
  25.  
  26. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()  
  27. {  
  28. for(int i = 0; i < items.Length; i++)  
  29. {  
  30. yield return items[i];  
  31. }  
  32. }  
  33.  
  34. #endregion  

我們通過(guò)yield return關(guān)鍵字來(lái)返回一個(gè)IEnumerator接口,這個(gè)關(guān)鍵在在編譯之后會(huì)自動(dòng)生成對(duì)應(yīng)的迭代器的代碼。

在.NET中迭代器只能先前,在c++中可以向后等其他操作。

注意:在迭代的過(guò)程中,我們不能向集合添加內(nèi)容,后移除集合里的item,這樣將會(huì)導(dǎo)致一些問(wèn)題的出現(xiàn)。以上介紹C# Iterator迭代器模式。

【編輯推薦】

  1. C#數(shù)據(jù)庫(kù)查詢和操作大全
  2. 淺析C#擴(kuò)展方法
  3. C# Singleton的使用及優(yōu)缺點(diǎn)探討
  4. 詳細(xì)分析C#數(shù)據(jù)庫(kù)連接池
  5. C#數(shù)據(jù)庫(kù)備份及還原的實(shí)現(xiàn)代碼

網(wǎng)站欄目:C#Iterator迭代器模式
文章源于:http://uogjgqi.cn/article/dhijdpp.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流