您的位置:首页 > 编程语言 > C#

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){}

迭代器的返回类型必须为 IEnumerableIEnumeratorIEnumerable<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();
}
}


输出结果:



可以看到,自定义的迭代器 GetChildren 成功foreach了。

注意:默认迭代器 GetEnumerator 的返回类型是 IEnumerator ,并且在使用foreach时 in 后面直接是类名。而自定义迭代器 GetChildren 的返回类型是 IEnumerable,并且在使用foreach时 in 后面是 PeopleEnum.GetChildren(类名.迭代器名)。好像,好像是规定这样子的,原理是什么还不清楚。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐