C 基礎系列(2)之迭代器

2021-08-19 21:09:45 字數 3270 閱讀 3138

在.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 是普通迭代器的介面卡,通過重新定義自增和自減操作,以達到按反序遍歷元素的目的。如果在標準演算法庫中用反向迭代器來代替普通的迭代器,那麼執行結果與正常情況下相反。除此之外,其用法與普通迭代器完全一樣,我們不作詳細討論。這裡主要討論的是反向迭代器的乙個很特殊...