c#实现foreach
2015-08-18 15:22
274 查看
方式:
第一种,通过继承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 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。
第一种,通过继承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]; } } }
相关文章推荐
- C#计算字符串哈希值(MD5、SHA)的方法小结
- C#实现计算器
- C#值类型和引用类型的深入理解
- C#保存与读取DataTable信息到XML格式的方法
- 关于c# 在vs2013 x86平台上开辟大内存
- c#面向对象基础总结-------对象和类
- C#中的static、readonly与const的比较
- (C#)Winform修改DateTimePicker控件的背景色
- C#的try-catch-finally 中的catch语句的异常有顺序的区别
- C# in depth (第七章 最后的一些特性)
- “锁定”语句 lock(C# 参考)
- C# winform combobox 在绑定数据之后插入一项选择项
- C# LINQ详解(一)
- c#(winform)中ComboBox和ListBox添加项,写一个用户控件
- C#结构体对象不能为空如何处理
- C#位操作与枚举的应用
- C#中comboBox绑定数据集后事件中取值出System.data.dataRowView问题
- C# 创建Excel并写入内容
- 编写高质量代码改善C#程序的157个建议——建议70:避免在调用栈较低的位置记录异常
- C#实现多线程界面刷新