日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#实现迭代器

發(fā)布時間:2023/12/4 C# 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#实现迭代器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

迭代器模式(Iterator),提供一種方法順序訪問一個聚合對象中的各種元素,而又不暴露該對象的內(nèi)部表示。C#中使用IEnumerator接口實現(xiàn),Java中使用Iterator接口實現(xiàn),其中原理都差不多,下面我就用C#代碼來演示下迭代器的實現(xiàn)。

假如我要實現(xiàn)一個自定義容器列表,就叫它SpecialList吧,可以實現(xiàn)類似ArrayList的功能。如下:

這個時候我想遍歷這個列表,當(dāng)我使用foreach的時候,報錯了。如下:

提示SpecialList不包含GetEnumerator的公共實例定義,在C#中,如果想要使用foreach遍歷列表對象,這個列表對象必須要實現(xiàn)IEnumerable的GetEnumerator()方法,我們來加一下。如下:

繼承后,foreach列表的時候就不會再報錯了,但我們并沒有實現(xiàn)GetEnumerator()這個方法。我們看一下這個方法的返回值類型為IEumerator,F12進去看一下這個接口的定義。如下:

這個接口里面有兩個方法和一個屬性。其中MoveNext()是最核心的方法,就是在這個里面實現(xiàn)列表的遍歷。話不多說,我們先定義一個繼承IEnumerator的類,就叫SpecialEnumerator吧。如下:

不好意思,我已經(jīng)簡單的寫好這個類了,那就簡單的講一個這個類的原理吧。SpecialEnumerator主要定義了一個SpecialList類型的_list,還有當(dāng)前元素的_current,還有當(dāng)前索引的_index。我們重點看一下MoveNext方法,里面的代碼其實也非常簡單,就是判斷_index是否已經(jīng)到底,沒有的話叫取出當(dāng)前_index上的元素賦予_cuurent,然后返回true,這里的返回值給到foreach,如果為true,則繼續(xù)遍歷,如果為false,則foreach跳出循環(huán)。我們再來看一下SpecialList中怎么使用SpecialEnumerator類。如下:

這樣只是返回SpecialEnumerator的一個實例,同時將當(dāng)前要枚舉的列表對象(this)傳入進去。你可能會有疑問,這里只是返回一個對象,在foreach中并沒有循環(huán)判斷MoveNext是true還是false的代碼,那它是怎么實現(xiàn)的呢?其實foreach只是一個語法糖,它本質(zhì)上其實是使用了while語法來實現(xiàn)的。如下:

到這里,相信大家已經(jīng)明白迭代器是怎么實現(xiàn)的了。最后再補充一下,大家可能會覺得額外實現(xiàn)SpecialEnumerator類比較繁瑣,其實如果你的列表遍歷規(guī)則比較簡單的話,可以使用yield語法來代替SpecialEnumerator類,只要這樣寫就行。如下:

但如果你的列表遍歷規(guī)則比較特殊,比如像棧、隊列這樣的容器類時,還是建議實現(xiàn)枚舉類,這樣可以將遍歷規(guī)則封裝在MoveNext中。

總結(jié)

以上是生活随笔為你收集整理的C#实现迭代器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。