方式:
第一種,通過繼承IEnumerable接口實現foreach語句。
包括MoveNext、Reset函數和Current屬性,以便GetEnumerator函數能獲取枚舉數。
第二種,用迭代器實現枚舉器。
-
迭代器是可以返回相同類型的值的有序序列的一段代碼。
-
迭代器可用作方法、運算符或 get 訪問器的代碼體。
-
迭代器代碼使用 yield return 語句依次返回每個元素。yield break 將終止迭代。有關更多信息,請參見 yield。
-
可以在類中實現多個迭代器。每個迭代器都必須像任何類成員一樣有唯一的名稱,並且可以在 foreach 語句中被客戶端代碼調用,如下所示:foreach(int x in SampleClass.Iterator2){}
-
迭代器的返回類型必須爲 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。
yield 關鍵字用於指定返回的值。到達 yield return 語句時,會保存當前位置。下次調用迭代器時將從此位置重新開始執行。
public class 雞
{
int 身高;
int 體重;
int 三圍;
public 雞(int _身高, int _體重, int _三圍)
{
身高 = _身高;
體重 = _體重;
三圍 = _三圍;
}
public override string ToString()
{
return string.Format("我是一隻雞。我身高是:{0},我的體重是:{1},我的三圍是{2}", 身高, 體重,三圍);
}
}
public class 雞羣 : IEnumerator,IEnumerable
{
int position = -1;
private 雞[] ji;
public 雞羣(雞[] pArray)
{
ji = new 雞[pArray.Length];
for (int i = 0; i < pArray.Length; i++)
{
ji[i] = pArray[i];
}
}
public bool MoveNext()
{
position++;
return (position < ji.Length);
}
public void Reset()
{
position = -1;
}
public object Current
{
get
{
return ji[position];
}
}
/// <summary>
/// 返回一個循環訪問集合的枚舉器。
/// </summary>
/// <returns></returns>
public IEnumerator GetEnumerator()
{
return new 雞羣(ji);
}
}
class Program
{
static void Main(string[] args)
{
雞[] jis = new 雞[]
{
new 雞(10, 10,80),
new 雞(20, 20,90),
new 雞(30, 30,100),
};
雞羣 jiqun = new 雞羣(jis);
foreach (var item in jiqun)
{
System.Console.WriteLine(item);
}
while (jiqun.MoveNext())
{
System.Console.WriteLine(jiqun.Current);
}
System.Console.ReadKey();
雞羣2 jiqun2 = new 雞羣2(jis);
foreach (var item in jiqun2)
{
System.Console.WriteLine(item);
}
System.Console.ReadKey();
}
}
public class 雞羣2
{
private 雞[] ji;
public 雞羣2(雞[] list)
{
ji = list;//引用類型
}
public IEnumerator GetEnumerator()
{
for (int i = 0; i < ji.Length; i++)
{
yield return ji[i];
}
}
}