溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C# 迭代器是什么

發(fā)布時間:2021-10-14 16:51:44 來源:億速云 閱讀:138 作者:柒染 欄目:編程語言

C# 迭代器是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

  迭代器模式是設(shè)計(jì)模式中行為模式(behavioralpattern)的一個例子,他是一種簡化對象間通訊的模式,也是一種非常容易理解和使用的模式。簡單來說,迭代器模式使得你能夠獲取到序列中的所有元素而不用關(guān)心是其類型是array,list,linkedlist或者是其他什么序列結(jié)構(gòu)。這一點(diǎn)使得能夠非常高效的構(gòu)建數(shù)據(jù)處理通道(datapipeline)--即數(shù)據(jù)能夠進(jìn)入處理通道,進(jìn)行一系列的變換,或者過濾,然后得到結(jié)果。事實(shí)上,這正是LINQ的核心模式。

  在.NET中,迭代器模式被IEnumerator和IEnumerable及其對應(yīng)的泛型接口所封裝。如果一個類實(shí)現(xiàn)了IEnumerable接口,那么就能夠被迭代;調(diào)用GetEnumerator方法將返回IEnumerator接口的實(shí)現(xiàn),它就是迭代器本身。迭代器類似數(shù)據(jù)庫中的游標(biāo),他是數(shù)據(jù)序列中的一個位置記錄。迭代器只能向前移動,同一數(shù)據(jù)序列中可以有多個迭代器同時對數(shù)據(jù)進(jìn)行操作。

foreach語句對迭代器的支持

  在C#1中已經(jīng)內(nèi)建了對迭代器的支持,那就是foreach語句。使得能夠進(jìn)行比for循環(huán)語句更直接和簡單的對集合的迭代,編譯器會將foreach編譯來調(diào)用GetEnumerator和MoveNext方法以及Current屬性,如果對象實(shí)現(xiàn)了IDisposable接口,在迭代完成之后會釋放迭代器。但是在C#1中,實(shí)現(xiàn)一個迭代器是相對來說有點(diǎn)繁瑣的操作。C#2使得這一工作變得大為簡單,節(jié)省了實(shí)現(xiàn)迭代器的不少工作。

  假設(shè)我們需要實(shí)現(xiàn)一個基于環(huán)形緩沖的新的集合類型。我們將實(shí)現(xiàn)IEnumerable接口,使得用戶能夠很容易的利用該集合中的所有元素。我們的忽略其他細(xì)節(jié),將注意力僅僅集中在如何實(shí)現(xiàn)迭代器上。集合將值存儲在數(shù)組中,集合能夠設(shè)置迭代的起始點(diǎn),例如,假設(shè)集合有5個元素,你能夠?qū)⑵鹗键c(diǎn)設(shè)為2,那么迭代輸出為2,3,4,0,最后是1.

  由于我們將起始點(diǎn)設(shè)置為3,所以集合輸出的結(jié)果是d,e,a,b及c,

GetEnumerator方法

  我們還沒有實(shí)現(xiàn)GetEnumerator方法,但是如何寫GetEnumerator部分的邏輯呢,第一就是要將游標(biāo)的當(dāng)前狀態(tài)存在某一個地方。一方面是迭代器模式并不是一次返回所有的數(shù)據(jù),而是客戶端一次只請求一個數(shù)據(jù)。這就意味著我們要記錄客戶當(dāng)前請求到了集合中的那一個記錄。C#2編譯器對于迭代器的狀態(tài)保存為我們做了很多工作。

  現(xiàn)在來看看,要保存哪些狀態(tài)以及狀態(tài)存在哪個地方,設(shè)想我們試圖將狀態(tài)保存在IterationSample集合中,使得它實(shí)現(xiàn)IEnumerator和IEnumerable方法。咋一看,看起來可能,畢竟數(shù)據(jù)在正確的地方,包括起始位置。我們的GetEnumerator方法僅僅返回this。但是這種方法有一個很重要的問題,如果GetEnumerator方法調(diào)用多次,那么多個獨(dú)立的迭代器就會返回。例如,我們可以使用兩個嵌套的foreach語句,來獲取所有可能的值對。這兩個迭代需要彼此獨(dú)立。這意味著我們需要每次調(diào)用GetEnumerator時返回的兩個迭代器對象必須保持獨(dú)立。我們?nèi)耘f可以直接在IterationSample類中通過相應(yīng)函數(shù)實(shí)現(xiàn)。但是我們的類擁有了多個職責(zé),這位背了單一職責(zé)原則。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI