方式:
第一种,通过继承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];
}
}
}