C#中的IEnumerable簡介及簡單實現(xiàn)實例
IEnumerable這個接口在MSDN上是這么說的,它是一個公開枚舉數(shù),該枚舉數(shù)支持在非泛型集合上進行簡單的迭代。換句話說,對于所有數(shù)組的遍歷,都來自IEnumerable,那么我們就可以利用這個特性,來定義一個能夠遍歷字符串的通用方法.
下面先貼出code.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace mycs { class Program { static void Main(string[] args) { charlist mycharlist = new charlist("hello world"); foreach (var c in mycharlist) { Console.Write(c); } Console.ReadLine(); } } class charlist : IEnumerable { public string TargetStr { get; set; } public charlist(string str) { this.TargetStr = str; } public IEnumerator GetEnumerator() { //c# 1.0 return new CharIterator(this.TargetStr); //c# 2.0 /* for (int index = this.TargetStr.Length; index > 0;index-- ) { yield return this.TargetStr[index - 1]; } */ } } class CharIterator : IEnumerator { public string TargetStr { get; set; } public int position { get; set; } public CharIterator(string targetStr) { this.TargetStr = targetStr; this.position = this.TargetStr.Length; } public object Current { get { if (this.position==-1||this.position==this.TargetStr.Length) { throw new InvalidOperationException(); } return this.TargetStr[this.position]; } } public bool MoveNext() { if (this.position!=-1) { this.position--; } return this.position > -1; } public void Reset() { this.position = this.TargetStr.Length; } } }
在上面的例子c# 1.0中,CharIterator就是迭代器的實現(xiàn),position字段存儲當(dāng)前的迭代位置,通過Current屬性可以得到當(dāng)前迭代位置的元素,MoveNext方法用于更新迭代位置,并且查看下一個迭代位置是不是有效的。
當(dāng)我們通過VS單步調(diào)試下面語句的時候:
foreach (var c in charList)
代碼首先執(zhí)行到foreach語句的charList處獲得迭代器CharIterator的實例,然后代碼執(zhí)行到in會調(diào)用迭代器的MoveNext方法,最后變量c會得到迭代器Current屬性的值;前面的步驟結(jié)束后,會開始一輪新的循環(huán),調(diào)用MoveNext方法,獲取Current屬性的值。
通過C# 1.0中迭代器的代碼看到,要實現(xiàn)一個迭代器就要實現(xiàn)IEnumerator接口,然后實現(xiàn)IEnumerator接口中的MoveNext、Reset方法和Current屬性。
在C# 2.0中可以直接使用yield語句來簡化迭代器的實現(xiàn)。
如上面public IEnumerator GetEnumerator()方法中注釋掉的部分。
通過上面的代碼可以看到,通過使用yield return語句,我們可以替換掉整個CharIterator類。
yield return語句就是告訴編譯器,要實現(xiàn)一個迭代器塊。如果GetEnumerator方法的返回類型是非泛型接口,那么迭代器塊的生成類型(yield type)是object,否則就是泛型接口的類型參數(shù)。
相關(guān)文章
C#中TreeView實現(xiàn)適合兩級節(jié)點的選中節(jié)點方法
這篇文章主要介紹了C#中TreeView實現(xiàn)適合兩級節(jié)點的選中節(jié)點方法,實例分析了C#中TreeView節(jié)點操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09C#中WPF內(nèi)存回收與釋放LierdaCracker的實現(xiàn)
本文主要介紹了C#中WPF內(nèi)存回收與釋放LierdaCracker的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07