IEnumerator和IEnumerable是 .NET内置的接口,用來為集合類添加周遊的功能。然而兩者高在一起,讓我剛開始學習時頭痛不已。檢視MSDN和網上資料後,将自己的收獲整理下來:
看着兩者的英文名,我們大概可以猜一下:
IEnumerable的實作标志該類具有了枚舉的能力,并且在适當的時機可以傳回疊代器。它隻有一個GetEnumerator()
IEnumerator GetEnumerator();
IEnumerator的實作标志着該類具有疊代器的功能,并且允許繼承該接口的類制定自己的疊代規則,它有:
object Current{get;} //傳回目前位置的元素
bool MoveNext() //移動到下一個元素;
void Reset() //重置疊代位置到開始處
為了疊代,我們必須需要一個辨別目前疊代位置的字段,是以請再為疊代器添加一個index的字段吧。
index初始值為-1,MoveNext() 就是調整index的值,将疊代的位置向後移動,當超出界限時傳回False,表示疊代結束,否則為True;
-----------------------------------------------分割線---------------------------------------------------------
下面通過一個例子了解一下:
Person類
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
People類 (繼承自IEnumerable 包含一個People類型的數組)
class People : IEnumerable
{
private Person[] pers;
public People(Person[] pers)
{
this.pers = pers;
}
public IEnumerator GetEnumerator()
{
return new PeopleEnum(pers);
}
}
PeopleEnum類(繼承IEnumerator用于産生疊代)
class PeopleEnum : IEnumerator
{
private int index = -1;
private Person[] pers;
public PeopleEnum(Person [] pers)
{
this.pers=pers;
}
public object Current
{
get
{
try
{
return pers[index];
}
catch(Exception e)
{
throw e;
}
}
}
public bool MoveNext()
{
return ++index < pers.Length;
}
public void Reset()
{
index = -1;
}
}
主函數測試
public class Test
{
static void Main()
{
Person[] pers = { new Person { FirstName = "A", LastName = "a" }, new Person { FirstName = "B", LastName = "b" } };
People peo = new People(pers);
IEnumerator enrator = peo.GetEnumerator();
while (enrator.MoveNext())
{
Console.WriteLine( ((Person)enrator.Current ).FirstName +"::"+((Person)enrator.Current).LastName);
}
}
}
請注意,PeopleEnum繼承自IEnumerator,是以可以類型轉換為IEnumberator。
在主函數中,先生成一個Person數組,然後用這個數組初始化一個People的對象,因為People實作了IEnmerable是以它能夠疊代枚舉,并可以傳回一個枚舉器IEnumerator,而不巧的是,IEnumerable接口并沒有包含怎麼實作疊代,是以還需要繼承自IEnumberator的PeopleEnum類來産生一個疊代器。
這樣一切就都具備了,開始While循環疊代People集合。
運作結果: