C#学习之用迭代器实现枚举器
2012-02-22 13:14
169 查看
本人初学C#,本文仅供个人整理思路用,那里说得不对,请大家多多指教,万分感激!
上一篇文章为自定义类实现了foreach的功能,但实现过程中要实现IEnumerator接口(包括MoveNext、Reset函数和Current属性)以便GetEnumerator函数能获取枚举数,有点复杂,有点繁琐。
已经知道:主要一个类实现了GetEnumerator函数就能foreach,而实现IEnumerator接口只是实现GetEnumerator函数的其中一个办法,也就说还有其他办法实现GetEnumerator函数了?是的,C#2.0为我们提供了一种很简单的方法来实现GetEnumerator函数,那就是使用迭代器!(还记得吧,C#里的迭代器和C++里的是不同的)
下面是来自MSDN的解说:
迭代器可用作方法、运算符或 get 访问器的代码体。
迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。有关更多信息,请参见 yield。
可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}
迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。
yield 关键字用于指定返回的值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。
View Code
输出结果:
![](http://pic002.cnblogs.com/images/2012/375470/2012022213040767.jpg)
可以看到,自定义的迭代器 GetChildren 成功foreach了。
注意:默认迭代器 GetEnumerator 的返回类型是 IEnumerator ,并且在使用foreach时 in 后面直接是类名。而自定义迭代器 GetChildren 的返回类型是 IEnumerable,并且在使用foreach时 in 后面是 PeopleEnum.GetChildren(类名.迭代器名)。好像,好像是规定这样子的,原理是什么还不清楚。
上一篇文章为自定义类实现了foreach的功能,但实现过程中要实现IEnumerator接口(包括MoveNext、Reset函数和Current属性)以便GetEnumerator函数能获取枚举数,有点复杂,有点繁琐。
已经知道:主要一个类实现了GetEnumerator函数就能foreach,而实现IEnumerator接口只是实现GetEnumerator函数的其中一个办法,也就说还有其他办法实现GetEnumerator函数了?是的,C#2.0为我们提供了一种很简单的方法来实现GetEnumerator函数,那就是使用迭代器!(还记得吧,C#里的迭代器和C++里的是不同的)
下面是来自MSDN的解说:
迭代器概述
迭代器是可以返回相同类型的值的有序序列的一段代码。迭代器可用作方法、运算符或 get 访问器的代码体。
迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。有关更多信息,请参见 yield。
可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}
迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。
yield 关键字用于指定返回的值。到达 yield return 语句时,会保存当前位置。下次调用迭代器时将从此位置重新开始执行。
第一部分:使用默认迭代器实现获取枚举数
1、定义Person类View Code
class Program { static void Main(string[] args) { Person[] persons = new Person[] { new Person("aaa", 16), new Person("bbb", 18), new Person("ccc", 22) }; PeopleEnum1 peopleEnum = new PeopleEnum1(persons); foreach (var item in peopleEnum) { System.Console.WriteLine(item); } Console.WriteLine("\n集合中未成年人的信息"); foreach (var item in peopleEnum.GetChildren) { Console.WriteLine(item); } System.Console.ReadKey(); } }
输出结果:
![](http://pic002.cnblogs.com/images/2012/375470/2012022213040767.jpg)
可以看到,自定义的迭代器 GetChildren 成功foreach了。
注意:默认迭代器 GetEnumerator 的返回类型是 IEnumerator ,并且在使用foreach时 in 后面直接是类名。而自定义迭代器 GetChildren 的返回类型是 IEnumerable,并且在使用foreach时 in 后面是 PeopleEnum.GetChildren(类名.迭代器名)。好像,好像是规定这样子的,原理是什么还不清楚。
相关文章推荐
- C#学习之用迭代器实现枚举器
- C# 枚举器 手动实现枚举器 可枚举集合 枚举器操作 迭代器
- C# 枚举器 手动实现枚举器 可枚举集合 枚举器操作 迭代器
- C# 迭代器实现枚举器
- 了解 C# foreach 内部语句和使用 yield 实现的自定义迭代器
- C#学习基本概念之迭代器(Iterator)
- EXTJS学习系列提高篇:第二篇(转载)作者殷良胜,结合EXT2.2+C#.net实现将数据导入Excel的功能
- STL之list学习(2)(list代码实现)(只剩最后一步,迭代器升级!!)
- C# 学习笔记(四) 结构体实现接口后是值类型还是引用类型
- 黑马程序员之 C#学习笔记:飞行棋地图二维数组实现方法
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
- [深入学习C#]C#实现多线程的方式:使用Parallel类
- 《设计模式:基于C#的工程化实现及扩展》学习笔记 01 准备篇 -- 前言
- Lua的系统学习(杂)_通过Lua调用C#方法(热更新最直观的原理理解)_简单的随机数实现
- C#学习笔记(十一)-实现Windows程序的数据绑定
- C#学习小记12实现一个接口
- 黑马程序员 C#学习笔记⑥ 三层架构基础实现员工信息管理
- [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
- C#数据结构和算法学习系列六----堆栈、堆栈的实现和应用
- 黑马程序员之C#编程基础学习笔记:用while continue实现计算1到100之间的除了能被7整除之外所有整数的和。