天天看點

[c#基礎]集合foreach的必要條件和自定義集合

最近翻看了之前的學習筆記,看到foreach,記得當時老師講的時候,有點犯渾,不是很明白,這好比,上國小時,你不會乘法口訣,但是随着時間的增長,你不自覺的都會了,也悟出個小道理,有些東西,你當時不太懂,但随着你的閱曆和經驗的增長,有那麼一天你會恍然大悟,哦,原來是這樣。

提到foreach就不得不說集合,那麼就先從自定義的集合開始吧。

<a></a>

不知道自定義的集合和ArrayList是否一樣,可以簡單的測試一下。

此時是.Net中的ArrayList,結果:

[c#基礎]集合foreach的必要條件和自定義集合

自定義的集合,結果:

[c#基礎]集合foreach的必要條件和自定義集合

輸出結果一樣,那麼現在用foreach周遊,自定義集合中的元素。F6編譯,會提示錯誤。

[c#基礎]集合foreach的必要條件和自定義集合

 其實foreach是怎樣工作的呢?

衆所周知foreach中in後面的對象應該是實作IEnumerable接口的,程式運作時本質是在調用IEnumerable的GetEnumerator函數來傳回一個IEnumerator對象,foreach就是利用IEnumerator對象的Current,MoveNext和Reset成員來進行一段資料的枚舉。簡單的代碼實作如下:

将這個代碼放在自定義集合中,定義一個方法GetArray(),然後測試一下

測試結果:

[c#基礎]集合foreach的必要條件和自定義集合

你運作會發現多出很多逗号,原因是執行後,enumerator沒有被Dispose掉,而繼承IDisposable的疊代器(IEnumerator)在foreach結束後會被正确處理掉(調用Dispose方法)。

實作IEnumerable接口必須實作它裡面的成員GetEnumerator()方法:

該方法的傳回值為實作了IEnumerator接口的類的對象。那麼現在需要定義一個實作了該接口的類。

疊代需要數組參數,在構造函數中将自定義集合中的數組傳進來,并且在MoveNext中需要判斷指針是否移動到數組的末尾,那麼需要數組的長度。

MyArrayList中GetEnumerator()方法實作

MyEnumerator類

測試,foreach語句,然後編譯不再報錯,說明已經成功了,結果如下:

[c#基礎]集合foreach的必要條件和自定義集合

這次後邊不會多出逗号,原因實作了疊代器接口而疊代器繼承自IDisposable接口,最後調用了Dispose()方法

foreach周遊in後面的對象需實作IEnumerable接口。

東西比較基礎,以上是個人了解,如了解有誤,請指正,以免誤人子弟。

部落格位址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

部落格版權:

本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。

如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!

再次感謝您耐心的讀完本篇文章。

轉載:http://www.cnblogs.com/wolf-sun/p/3549968.html