在.net中,迭代器模式被ienumerator和ienumerable及其對應的泛型介面所封裝。如果乙個類實現了ienumerable介面,那麼就能夠被迭代;呼叫getenumerator方法將返回ienumerator介面的實現,它就是迭代器本身。迭代器類似資料庫中的游標,它是資料序列中的乙個位置記錄。迭代器只能向前移動,同一資料序列中可以有多個迭代器同時對資料進行操作。
迭代器可用於逐步迭代集合,例如列表和陣列。迭代器方法或 get 訪問器可對集合執行自定義迭代。 迭代器方法使用 yield return 語句返回元素,每次返回乙個。 到達 yield return 語句時,會記住當前在**中的位置。 下次呼叫迭代器函式時,將從該位置重新開始執行。通過 foreach 語句或 linq 查詢從客戶端**中使用迭代器。
泛型實現:
using system.runtime.compilerservices;
namespace system.collections.generic
}
非泛型實現:
using system.runtime.interopservices;
namespace system.collections
}
再來看下ienumerator的實現,它主要包括三個方法:current,movenext和reset。
using system.runtime.interopservices;
namespace system.collections
// 如果列舉數已成功地推進到下乙個元素,則為 true;如果列舉數傳遞到集合的末尾,則為 false。
bool movenext();
//將列舉數設定為其初始位置,該位置位於集合中第乙個元素之前。
void reset();
}}
因此,迭代器方法或 get 訪問器的返回型別可以是 ienumerable、ienumerable< t >、ienumerator 或 ienumerator< t >。
為了加深對迭代器的理解,本文參考了yangecnu的部落格(大家可以去看看大神的分享)。因此,自己也嘗試手(zhao)寫(ban)乙個迭代器來感受乙個最原始的氣息。在這裡, 假設我們需要實現乙個基於環形緩衝的新的集合型別。我們將實現ienumerable介面,使得使用者能夠很容易的利用該集合中的所有元素。我們的忽略其他細節,將注意力僅僅集中在如何實現迭代器上。集合將值儲存在陣列中,集合能夠設定迭代的起始點,例如,假設集合有5個元素,你能夠將起始點設為2,那麼迭代輸出為2,3,4,0,最後是1.**示例如下:
迭代器實現類:
using system;
using system.collections;
namespace testienumerator
public ienumerator getenumerator()
}class iterationsampleenumerator : ienumerator
public
object current
int32 index = position + parent.startingpoint;//考慮自定義開始位置的情況 #6
index = index % parent.values.length;
return parent.values[index];}}
public
bool
movenext()
return position < parent.values.length;
}public
void
reset()
}}
主程式測試類program.cs:
using system;
namespace
testienumerator
; //從陣列指定的開始位置進行迭代
iterationsample collection = new iterationsample(values, 3);
foreach (object x in collection)
//print "d e a b c"
console.readkey();}}
}
要實現乙個簡單的迭代器需要手動寫這麼多的**:需要記錄迭代的原始集合#1,記錄當前游標位置#2,返回元素時,根據當前游標和陣列定義的起始位置設定定迭代器在陣列中的位置#6。初始化時,將當前位置設定在第乙個元素之前#3,當第一次呼叫迭代器時首先需要呼叫movenext,然後再呼叫current屬性。在游標自增時對當前位置進行條件判斷#4,使得即使當第一次呼叫movenext時沒有可返回的元素也不至於出錯#5。重置迭代器時,我們將當前游標的位置還原到第乙個元素之前#7。
4.1 實現返回值為ienumerable型別的方法
通過迭代器方法來實現迭代,一般用於函式方法中,具體表現為:通過yield 關鍵字來實現返回值為ienumerable型別的方法,示例**如下:
using system;
using system.collections.generic;
namespace testienumerator
static
void main(string args)
}
4.2 實現返回值為ienumerator型別的方法
迭代的集合類daysoftheweek。首先,被迭代的集合類daysoftheweek 繼承ienumerable介面。然後,實現該介面下的getenumerator方法。由此,即可實現迭代的目的,無需理會底層ienumerator 介面的3個實現方法:current()、movenext()和reset()。示例**如下:
using system;
using system.collections;
using system.collections.generic;
namespace testienumerator
; public ienumerator getenumerator()}}
static
void main(string args)
// output: sun mon tue wed thu fri sat
console.readkey();}}
}
基礎 C 迭代器
迭代器是 c 2.0 中的新功能。迭代器是方法 get 訪問器或運算子,它使您能夠在類或結構中支援 foreach 迭代,而不必實現整個 ienumerable 介面。您只需提供乙個迭代器,即可遍歷類中的資料結構。當編譯器檢測到迭代器時,它將自動生成 ienumerable 或 ienumerabl...
C 基礎 迭代器
迭代器是什麼 在表現效果上看 標準迭代器的實現方法 region 標準迭代器的實現方法 關鍵介面口 ienumerator,ienumerable 命名空間 using system collections 可以通過同時繼承ienumerable和ienumerator實現其中的方法 class c...
C 迭代器之 反向迭代器
反向迭代器 reverse iterator 是普通迭代器的介面卡,通過重新定義自增和自減操作,以達到按反序遍歷元素的目的。如果在標準演算法庫中用反向迭代器來代替普通的迭代器,那麼執行結果與正常情況下相反。除此之外,其用法與普通迭代器完全一樣,我們不作詳細討論。這裡主要討論的是反向迭代器的乙個很特殊...