C#枚舉器和叠代器
Foreach能夠獲取數組中的每一個元素,原因數組能夠提供一個枚舉器的對象。對於枚舉器類型而言,必須有一個方法來獲取它。獲取一個對象枚舉器的方法是調用對象的GetEnumerator方法。數組是可枚舉類型。
IEnumerator接口:
實現了IEnumerator接口的枚舉器包含了Current、MoveNext以及Reset函數成員。
Current是返回序列中當前位置的屬性:
- 它是只讀屬性。
- 它返回object類型的引用,所以可以返回任何類型
MoveNext是枚舉器位置前進到下一項的方法。它也返回bool,指示新的位置是有效還是無效:
- 如果位置有效,返回true
- 如果位置無效,返回false
- 枚舉器原始位置在序列的第一項之前,因此MoveNxet必須在第一次使用Current之前。
Rest是把位置重置為原始狀態。
IEnumerable接口:
可枚舉類是指實現了IEnumerable接口的類。它只有一個成員——GetEnmuerator方法,返回對象的枚舉器。
示例:
using System;
using System.Collections;
class ColorEnumerator:IEnumerator{
string []_colors;
int _positon=-1;
public ColorEnumerator(string []the){
_colors=new string[the.length];
for(int i=0;i<the.length;i++)
_colors[i]=the[i];}
public object Current(){
return _colors[_positon];}
public bool MoveNext(){
if(_positon==-1||_positon>=_colors.lenth)
return false;
_positon++;
return true;}
public void Reset(){
_positon=-1;}}
class test:IEnumerable{
string Colors={“Black”,”White”};
public IEnumrator GetEnmurator{
return new ColorEnumrator(Colors);}
class Program{
static void main(){
test t=new test();
for(var s in test)
Console.WriteLine(s);
}}
泛型枚舉接口:
IEnumerator<T> 返回枚舉類型
IEnumerable<T> 返回枚舉器類型
叠代器
從C#2.0開始提供了更簡單的創建枚舉器和可枚舉類型的方式。實際上編譯器為我們創建他們。這種結構叫做叠代器。我們可以把手動編碼的可枚舉類型和枚舉器替換為由叠代器生成的可枚舉類型和枚舉器。
叠代器塊:有一個或多個yield語句的代碼塊。
常見叠代器模式:
當我們實現返回枚舉器的叠代器時,必須實現GetEnumerator來讓類可枚舉,它返回由叠代器返回的枚舉器.
如果我們在類中實現叠代器返回可枚舉類型,我們可以讓類實現GetEnumerator來讓類本身可被枚舉,或不實現GetEnumerator讓類本身不可被枚舉。
如果實現GetEnmertator,讓它調用叠代器方法以獲取自動生成的實現IEnumerable的類實例。然後,從IEnumerable對象返回的GetEnumerator創建的枚舉器。第一個foreach
如果不實現GetEnumerator使類本身不枚舉,仍然可使用由叠代器返回的可枚舉類,只需要調用叠代器方法。第二個foreach
class Myclass{
public IEnumerator<string>GetEnumerator(){
return IteratorMethod().GetEumerator();}
public IEnumerable<string>IteratorMethod(){
yield return “Fuck”;
yield return “Fuck1”;
yield return “Fuck2”;}}
……
Main(){
Myclass mc=new Myclass();
foreach(var str in mc)
……
foreach(var str in mc.IteratorMethod())
……
C#枚舉器和叠代器