溫馨提示×

溫馨提示×

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

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

C# 迭代器是什么

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

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

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

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

foreach語句對迭代器的支持

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

  假設我們需要實現一個基于環形緩沖的新的集合類型。我們將實現IEnumerable接口,使得用戶能夠很容易的利用該集合中的所有元素。我們的忽略其他細節,將注意力僅僅集中在如何實現迭代器上。集合將值存儲在數組中,集合能夠設置迭代的起始點,例如,假設集合有5個元素,你能夠將起始點設為2,那么迭代輸出為2,3,4,0,最后是1.

  由于我們將起始點設置為3,所以集合輸出的結果是d,e,a,b及c,

GetEnumerator方法

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女