前提知識:陣列可以被foreach語句遍歷陣列中的元素,原因是所有陣列的基類都是system.array ,而system.array 類實現了ienumerable介面,可以通過getenumerator方法按需提供乙個叫做列舉數(enumerator)的物件,列舉數可以依次返回請求的陣列的元素。 (注:c#裡面的列舉數,也就是列舉器,類似於c++中的迭代器,而c#中的迭代器是另外乙個意思。不知我這樣理解對否?)
第一步:建立person類
view code
1第二步:建立peopleenum類,該類繼承ienumerator介面,實現ienumerator介面裡的movenext、reset方法和current屬性public
class person
2
1112
public
override
string tostring()
13
16 }
view code
1第三步: 建立people類,該類繼承ienumerable介面,實現了getenumerator方法,getenumerator方法的作用是獲取列舉數(返回值是ienumerator型別的,就是列舉數的型別),在這裡是通過返回peopleenum類的乙個例項來取得列舉數。public
class peopleenum : ienumerator
2
1011
public
bool movenext()
12
1617
public
void reset()
18
2122
public
object current
23
28 }
2930 }
view code
1第四步:people類實現了介面ienumerable介面,所以people類的例項就能使用foreach來遍歷自身元素。主函式測試**如下:public
class people : ienumerable
2
12 }
1314
public ienumerator getenumerator()
15
18 }
1輸出如下class program
2 ;
1112 people peoplelist = new people(persons);
1314
foreach (var item in peoplelist)
15
1819 system.console.readkey();
20 }
21 }
第一部分裡的第二步建立peopleenum類,並實現裡其繼承的ienumerator介面裡的movenext、reset方法和current屬性,其實,該類已經具備了遍歷自身元素的條件了。
把主函式裡的測試的**改成如下,執行-》輸出,結果是一樣的
view code
1但是不能使用foreach語句,為什麼呢?因為使用foreach語句類必須提供getenumerator方法獲取該類的列舉數,然後編譯器通過這個列舉數來呼叫ienumerator介面裡的 movenext、reset方法和current屬性實現對類元素的遍歷。class program
2 ;
1112
while (peopleenum.movenext())
13
1617 system.console.readkey();
18 }
19 }
給peopleenum類新增乙個getenumerator方法
1主函式測試**改成如下:public ienumerator getenumerator()
2
1執行,成功!class program
2 ;
1112
13 peopleenum peopleenum = new peopleenum(persons);
1415
foreach (var item in peopleenum)
16
2021 system.console.readkey();
22 }
23 }
C 如何實現自定義類
pragma once include include using namespace std class csvitem csvitem const csvitem item void operator const csvitem item public string lock time 作業上鎖...
C 實現自定義string類
在一些c 筆試題裡,會有這樣一道題,那就是讓你自己實現乙個簡單的string類。自己在面試的時候就遇到過這個題。在這裡說一下自己是怎麼做的。主要包含一些基本的操作,建構函式 拷貝建構函式和析構函式。pragma once include using namespace std class mystr...
C 學習之 自定義模板
1.函式模板的定義 template 返回型別 函式名 模板函式常常可以解決我們 冗餘的情況,比如如果我們要實現若干數字排序,又要實現對字串進行排序等等,一般我們都要為每種型別排序都寫乙個排序函式,但模板函式就可以實現乙個函式就能達到要求。參考程式 include using namespace s...