C# 迭代器是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
目前創(chuàng)新互聯(lián)建站已為數(shù)千家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)絡空間、網(wǎng)站托管運營、企業(yè)網(wǎng)站設計、金城江網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
迭代器模式是設計模式中行為模式(behavioralpattern)的一個例子,他是一種簡化對象間通訊的模式,也是一種非常容易理解和使用的模式。簡單來說,迭代器模式使得你能夠獲取到序列中的所有元素而不用關心是其類型是array,list,linkedlist或者是其他什么序列結(jié)構(gòu)。這一點使得能夠非常高效的構(gòu)建數(shù)據(jù)處理通道(datapipeline)--即數(shù)據(jù)能夠進入處理通道,進行一系列的變換,或者過濾,然后得到結(jié)果。事實上,這正是LINQ的核心模式。
在.NET中,迭代器模式被IEnumerator和IEnumerable及其對應的泛型接口所封裝。如果一個類實現(xiàn)了IEnumerable接口,那么就能夠被迭代;調(diào)用GetEnumerator方法將返回IEnumerator接口的實現(xiàn),它就是迭代器本身。迭代器類似數(shù)據(jù)庫中的游標,他是數(shù)據(jù)序列中的一個位置記錄。迭代器只能向前移動,同一數(shù)據(jù)序列中可以有多個迭代器同時對數(shù)據(jù)進行操作。
在C#1中已經(jīng)內(nèi)建了對迭代器的支持,那就是foreach語句。使得能夠進行比for循環(huán)語句更直接和簡單的對集合的迭代,編譯器會將foreach編譯來調(diào)用GetEnumerator和MoveNext方法以及Current屬性,如果對象實現(xiàn)了IDisposable接口,在迭代完成之后會釋放迭代器。但是在C#1中,實現(xiàn)一個迭代器是相對來說有點繁瑣的操作。C#2使得這一工作變得大為簡單,節(jié)省了實現(xiàn)迭代器的不少工作。
假設我們需要實現(xiàn)一個基于環(huán)形緩沖的新的集合類型。我們將實現(xiàn)IEnumerable接口,使得用戶能夠很容易的利用該集合中的所有元素。我們的忽略其他細節(jié),將注意力僅僅集中在如何實現(xiàn)迭代器上。集合將值存儲在數(shù)組中,集合能夠設置迭代的起始點,例如,假設集合有5個元素,你能夠?qū)⑵鹗键c設為2,那么迭代輸出為2,3,4,0,最后是1.
由于我們將起始點設置為3,所以集合輸出的結(jié)果是d,e,a,b及c,
我們還沒有實現(xiàn)GetEnumerator方法,但是如何寫GetEnumerator部分的邏輯呢,第一就是要將游標的當前狀態(tài)存在某一個地方。一方面是迭代器模式并不是一次返回所有的數(shù)據(jù),而是客戶端一次只請求一個數(shù)據(jù)。這就意味著我們要記錄客戶當前請求到了集合中的那一個記錄。C#2編譯器對于迭代器的狀態(tài)保存為我們做了很多工作。
現(xiàn)在來看看,要保存哪些狀態(tài)以及狀態(tài)存在哪個地方,設想我們試圖將狀態(tài)保存在IterationSample集合中,使得它實現(xiàn)IEnumerator和IEnumerable方法。咋一看,看起來可能,畢竟數(shù)據(jù)在正確的地方,包括起始位置。我們的GetEnumerator方法僅僅返回this。但是這種方法有一個很重要的問題,如果GetEnumerator方法調(diào)用多次,那么多個獨立的迭代器就會返回。例如,我們可以使用兩個嵌套的foreach語句,來獲取所有可能的值對。這兩個迭代需要彼此獨立。這意味著我們需要每次調(diào)用GetEnumerator時返回的兩個迭代器對象必須保持獨立。我們?nèi)耘f可以直接在IterationSample類中通過相應函數(shù)實現(xiàn)。但是我們的類擁有了多個職責,這位背了單一職責原則。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。