Iterator:枚舉器
如果妳正在創建壹個表現和行為都類似於集合的類,允許類的用戶使用foreach語句對集合中的成員進行枚舉將會是很方便的。這在C# 2.0中比 C# 1.1更容易實現壹些。作為演示,我們先在 C# 1.1中為壹個簡單的集合添加枚舉,然後我們修改這個範例,使用新的C#2.0 枚舉構建方法。
我們將以創建壹個簡單化的List Box作為開始,它將包含壹個8字符串的數組和壹個整型,這個整型用於記錄數組中已經添加了多少字符串。構造函數將對數組進行初始化並使用傳遞進來的參數填充它。
public ListBox(params string[] initialStrings)
{
strings = new String[8];
foreach (string s in initialStrings)
{
strings[ctr++] = s;
}
}
除此以外,ListBox類還需要壹個Add方法(進行添加 string 的操作) 和 壹個返回數組中字符串個數的方法。
public void Add(string theString)
{
strings[ctr] = theString;
ctr++;
}
public int GetNumEntries()
{
return ctr;
}
NOTE:實際開發中,通常使用ArrayList,而不是固定大小的數組。在這裏為了程序簡單就沒有做數組下標越界的檢測。
從感覺上看,ListBox像是壹個集合,如果可以使用集合中通常使用的 foreach 循環來獲取listBox中的所有字符串將會是非常便利的。如此的話,可以這樣書寫代碼:
ListBox lb = new ListBox(a, b, c, d, e, f, g, h);
foreach (string s in lb) {
Console.WriteLine(s);
}
但是,會得到這樣壹個錯誤:
“Iterator.ListBox”不包含“GetEnumerator”的公***定義,因此 foreach 語句不能作用於“Iterator.ListBox”類型的變量
想要使用foreach語句,還必須實現IEnumerable 接口。
這個接口只要求實現壹個方法: GetEnumerator。這個方法必須返回壹個實現了IEnumerator 接口的對象。除此以外,我們需要返回的這個對象不僅實現了IEnumerator,而且知道如何枚舉ListBox對象。妳將需要創建壹個 ListBoxEmunerator(在下面描述):
NOTE: IEnumerable 和 IEnumerator 是不同的接口,請不要搞混了。
public IEnumerator GetEnumerator()
{
return new ListBoxEnumerator();
}
現在,ListBox 可以使用 foreach 循環了:
ListBox lbt = new ListBox(Hello, World);
lbt.Add(Who);
lbt.Add(Is);
lbt.Add(John);
lbt.Add(Galt);
foreach (string s in lbt)
{
Console.WriteLine(Value: {0}, s);
}
先是實例化這個ListBox ,並初始了兩個字符串,隨後又添加了四個。foreach循環接受ListBox實例,並且叠代它,依次返回字符串。輸出是:
Hello
World
Who
Is
John
Galt