已經知道:主要乙個類實現了getenumerator函式就能foreach,而實現ienumerator介面只是實現getenumerator函式的其中乙個辦法,也就說還有其他辦法實現getenumerator函式了?是的,c#2.0為我們提供了一種很簡單的方法來實現getenumerator函式,那就是使用迭代器!(還記得吧,c#裡的迭代器和c++裡的是不同的)
下面是來自msdn的解說:
yieldyield return
1、定義person類
view code
1public
class person
2
1112
public
override
string tostring()
13
16 }
13、主函式**public
class peopleenum1
2
13 }
1415
public ienumerator getenumerator()
16
21 }
2223 }
view code
1執行,成功,嘿嘿class program
2 ;
1112 peopleenum1 peopleenum = new peopleenum1(persons);
1314
foreach (var item in peopleenum)
15
1920 system.console.readkey();
21 }
22 }
第一部分用預設迭代器getenumerator 實現了類的foreach,我們也可以定義自己的迭代器來獲取自己想要的列舉數。比較說,我想列舉出類中未成年人的資訊,預設的迭代器無能為力,該怎麼實現自定義的迭代器呢?
1、為peopleenum1類新增乙個迭代器 getchildren ,在這裡,這個迭代器是乙個屬性,也可以定義為函式。對於類中的元素,只有age 小於18的元素才 yield return ,其他的不要。
view code
12、主函式**public
class peopleenum1
2
13 }
1415
//預設的迭代器?
16public ienumerator getenumerator()
17
22 }
2324
25//
自定義迭代器
26 public ienumerable getchildren
27
36 }
37 }
38 }
39 }
view code
1輸出結果:class program
2 ;
1112
13 peopleenum1 peopleenum = new peopleenum1(persons);
1415
foreach (var item in peopleenum)
16
1920
21 console.writeline("
\n集合中未成年人的資訊
");22
23foreach (var item in peopleenum.getchildren)
24
2728 system.console.readkey();
29 }
30 }
可以看到,自定義的迭代器 getchildren 成功foreach了。
注意:預設迭代器 getenumerator 的返回型別是 ienumerator ,並且在使用foreach時 in 後面直接是類名。而自定義迭代器 getchildren 的返回型別是 ienumerable,並且在使用foreach時 in 後面是 peopleenum.getchildren(類名.迭代器名)。好像,好像是規定這樣子的,原理是什麼還不清楚。
C 學習之用迭代器實現列舉器
已經知道 主要乙個類實現了getenumerator函式就能foreach,而實現ienumerator介面只是實現 getenumerator函式的其中乙個辦法,也就說還有其他辦法實現getenumerator函式了?是的,c 2.0為我們提供了一種很簡單的方 法來實現getenumerator函...
C 學習之用迭代器實現列舉器
已經知道 主要乙個類實現了getenumerator函式就能foreach,而實現ienumerator介面只是實現getenumerator函式的其中乙個辦法,也就說還有其他辦法實現getenumerator函式了?是的,c 2.0為我們提供了一種很簡單的方法來實現getenumerator函式,...
C 學習之用迭代器實現列舉器
已經知道 主要乙個類實現了getenumerator函式就能foreach,而實現ienumerator介面只是實現 getenumerator函式的其中乙個辦法,也就說還有其他辦法實現getenumerator函式了?是的,c 2.0為我們提供了一種很簡單的方 法來實現getenumerator函...