Net面向对象程序设计19枚举集合2

上传人:工**** 文档编号:578656571 上传时间:2024-08-24 格式:PPT 页数:28 大小:889.02KB
返回 下载 相关 举报
Net面向对象程序设计19枚举集合2_第1页
第1页 / 共28页
Net面向对象程序设计19枚举集合2_第2页
第2页 / 共28页
Net面向对象程序设计19枚举集合2_第3页
第3页 / 共28页
Net面向对象程序设计19枚举集合2_第4页
第4页 / 共28页
Net面向对象程序设计19枚举集合2_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《Net面向对象程序设计19枚举集合2》由会员分享,可在线阅读,更多相关《Net面向对象程序设计19枚举集合2(28页珍藏版)》请在金锄头文库上搜索。

1、.NET.NET面向对象程序设计面向对象程序设计第第1919章章枚举集合枚举集合19.1枚举集合中的元素枚举集合中的元素foreach语句极大的句极大的简化了需要化了需要编写的代写的代码int pins = 9, 3, 7, 2 ; foreach (int pin in pins) Console.WriteLine(pin); 为什么数什么数组可以可以这么做呢?么做呢?u数数组组可可以以按按需需提提供供一一个个叫叫做做枚枚举举器器的的对对象象,枚枚举举器器可以依次返回请求的数组的元素可以依次返回请求的数组的元素u枚枚举举器器指指导导项项的的次次序序并并且且跟跟踪踪它它在在序序列列中中的的位

2、位置置,然后返回请求的当前项然后返回请求的当前项对于枚于枚举器的器的类型而言,必型而言,必须有一个方法来有一个方法来获取它取它们在在.net中中获取取一一个个对象象枚枚举器器的的标准准方方法法是是调用用对象象的的GetEnumerator方法方法凡凡是是实现了了GetEnumerator方方法法的的类型型叫叫做做可可枚枚举类型型enumerable可可 枚枚 举 的的 集集 合合 : 实 现 了了 System.Collections .IEnumerable接口的一个集合接口的一个集合C#中所有数中所有数组都是都是System.Array类的的实例例该类是是实现了了IEnumerable接口

3、的一个集合接口的一个集合类在在IEnumerable接口中,包含一个名接口中,包含一个名为GetEnumerator的方法:的方法:uIEnumerator GetEnumerator();GetEnumerator方法返回一个枚方法返回一个枚举器器对象,象,该枚枚举器器实现了了System.Collections .IEnumerable接口接口枚枚举器器对象用于遍象用于遍历集合中的元素集合中的元素IEnumerator接口指定了以下方法和属性:接口指定了以下方法和属性:uobject Current get; ubool MoveNext(); uvoid Reset();foreach结

4、构构被被设计用用来来和和可可枚枚举类型型一一起起使使用用,只只要要给他他的的遍遍历对象象是是可可枚枚举类型型,比比如如数数组,它会它会执行以下操作:行以下操作:u通过调用通过调用GetEnumerator方法获取对象的枚举器方法获取对象的枚举器u从枚举器中请求每一项并且把它作为迭代变量从枚举器中请求每一项并且把它作为迭代变量枚举器类型枚举器类型枚枚举器器一一共共有有三三种种,工工作作原原理理相相同同,但但有有一一些些细小的区小的区别uIEnumerator/IEnumerable接口接口非泛型接口形式非泛型接口形式uIEnumerator/IEnumerable接接口口泛泛型型接接口口形形式式

5、u不使用接口形式不使用接口形式2、使用IEnumerator 接口IEnumerator接接 口口 包包 含含 三三 个个 函函 数数 成成 员 : Current、MoveNext以及以及Reset。uCurrent返回序列中当前位置项的属性。l它是只读属性。它是只读属性。l它返回它返回object类型的引用,所以可以返回任何类型。类型的引用,所以可以返回任何类型。uMoveNext是把枚举数位置前进到集合中下一项的方法。它也返回布尔值,指示新的位置是有效位置或已经超过了序列的尾部。l如果新的位置是有效的,方法返回如果新的位置是有效的,方法返回true。l如果新的位置是无效的(比如到达了尾部

6、),方法返回如果新的位置是无效的(比如到达了尾部),方法返回falsel枚枚举举数数的的原原始始位位置置在在序序列列中中的的第第一一项项之之前前。MoveNext必必须须在在第第 一一 次次 使使 用用 Current之之 前前 使使 用用 , 否否 则则 CLR会会 抛抛 出出 一一 个个InvalidOperationException异常。异常。uReset方法把位置重置为原始状态。枚举数类通常被声明为类中的嵌套类枚枚举数数与与序序列列中中的的当当前前项保保持持联系系的的方方式式完完全全取取决决于于实现。可可以以通通过对象象引引用用、索索引引值或或其其他他方方式式来来实现。对于于数数组来

7、来说,就使用,就使用项的索引。的索引。 有有 了了 集集 合合 的的 枚枚 举 数数 , 我我 们 就就 可可 以以 使使 用用 MoveNext和和Current成成员来模仿来模仿foreach循循环遍遍历集合中的集合中的项。例例如如数数组就就是是可可枚枚举类型型,所所以以下下面面的的代代码手手动做做foreach语句句自自动做做的的事事情情。输出出和和使使用用foreach循循环的的输出一出一样。要要创建建非非泛泛型型接接口口的的枚枚举数数类,必必须声声明明实现IEnumerator接口的接口的类。IEnumerator接口有如下的特性:接口有如下的特性:u它是它是System.Colle

8、ction命名空间的成员。命名空间的成员。u它包含三个方法它包含三个方法Current、MoveNext和和Reset。非非泛泛型型枚枚举举数类的框架数类的框架示例:实现一个列出颜色名数组的枚举类型示例:实现一个列出颜色名数组的枚举类型3、IEnumerable 接口IEnumerable接口只有一个成员GetEnumerator方法,它返回对象的枚举数。使用IEnumerable 和IEnumerator 的示例4、不实现接口的枚举数使用IEnumerable和IEnumerator接口可以创建可枚举类型和枚举数,但是这种方法有几个缺点:u首先,由Current返回的对象是object类型的

9、。对于值类型而言,在由Current返回之前必须装箱成object。在从Current获取之后,又必须再一次拆箱。如果需要操作大量的数据,会带来严重的性能问题。u非泛型接口方法的另外一个缺点是失去了类型安全。值被作为对象来枚举,所以可以是任何类型。这就消除了编译时的类型检测解决方法:解决方法:对于枚举数类:对于枚举数类:不要继承自不要继承自IEnumerator。像以前一样实现像以前一样实现MoveNext。像以前一样实现像以前一样实现Current,把返回类型设置为和枚举的项一样。,把返回类型设置为和枚举的项一样。不需要实现不需要实现Reset。对于可枚举类:对于可枚举类:不要继承自不要继承

10、自IEnumerable。像以前一样实现像以前一样实现GetEnumerator,设置返回值为枚举数类。,设置返回值为枚举数类。比较基于接口的和非基于接口的枚举数5、泛型枚举接口第 三 种 形 式 的 枚 举 数 是 使 用 泛 型 接 口IEnumerable和IEnumerator。对于非泛型接口形式:uIEnumerable接 口 的 GetEnumerator方 法 返 回 实 现IEnumerator枚举数类的实例。u实现IEnumerator的类实现了Current属性,它返回object的引用,我们必须把它转化为实际类型的对象。对于泛型接口形式:uIEnumerable接口的Ge

11、tEnumerator方法返回实现IEnumator的枚举数类的实例。u实现IEnumerator的类实现了Current属性,它返回实际类型的对象,而不是object基类的引用。6、IEnumerator接口IEnumerator接口使用泛型来返回实际的类型,而不是object类型的对象。IEnumerator接口从另外两个接口继承非泛型IEnumerable接口和IDisposable接口。所以,它肯定实现了它们的成员。IEnumerator接口本身只有一个Current方法,它返回衍生类型的项不是object类型的项。由于IEnumerator和IEnumerator都有一个叫做 Cur

12、rent的 成 员 , 我 们 应 该 显 式 实 现IEnumerator版本,然后在类中实现泛型版本如下代码使用泛型枚举数接口来实现ColorEnumerator实例7、IEnumerable接口泛型IEnumerable 接口与IEnumerable 的非泛型版本很相似。泛型版本从IEnumerable继承,所以也必须实现IEnumerable接口。如下代码演示了泛型可枚举接口的使用:8、迭代器为了了将将一一个个集集合合变得得“可可枚枚举”,其其过程程非非常常复复杂C#从从2.0版版本本开开始始提提供供了了更更简单的的创建建枚枚举数数和和可可枚枚举类型的方式。型的方式。编译器会器会为我我

13、们创建它建它们,这种种结构叫做迭代器构叫做迭代器迭迭代代器器(iterator)是是能能生生成成(yield)已已排排序序值序列的一个代序列的一个代码块注注意意:iterator实际并并不不是是一一个个可可枚枚举类的的成成员,相相反反,它它只只是是指指定定了了一一个个序序列列,枚枚举器器应该用用这个序列来返回其中的个序列来返回其中的值即即,迭迭代代器器只只是是对枚枚举序序列列的的一一个个描描述述,C#编译器可以利用它来器可以利用它来创建自己的枚建自己的枚举器器19.2.1 一个简单的迭代器一个简单的迭代器using System;using System.Collections.Generic

14、;using System.Collections;class BasicCollection : IEnumerable private List data = new List(); public void FillList(params T items) foreach (var datum in items) data.Add(datum); IEnumerator IEnumerable.GetEnumerator() foreach (var datum in data) yield return datum; IEnumerator IEnumerable.GetEnumerat

15、or() / Not implemented in this example BasicCollection bc = new BasicCollection();bc.FillList(Twas, brillig, and, the, slithy, toves);foreach (string word in bc)Console.WriteLine(word);迭代器块是有一个或多个yield语句的代码块。下面三种类型的代码块中的任意一种都可以是迭代器块:u方法主体u访问器主体u运算符主体迭代器块被认为与其他代码块不同。u其他块包含的语句被当作是命令式的。即,代码块的第一个语句被执行然后

16、是后面的语句,最后控制离开块。u迭代器块不是需要在同一时间执行的一序列命令式语句,而是描述了希望编译器为我们创建的枚举数类的行为。u迭代器块中的代码描述了如何枚举元素。迭迭代代器器返返回回一一个个泛泛型型枚枚举举数数,该该枚枚举举数数返返回回三三个个string类类型的项。型的项。yield return语句声明这是枚举中的下一项。语句声明这是枚举中的下一项。迭代器块有两个特殊语句:迭代器块有两个特殊语句:yield return;返返回回集集合合的的一一个个元元素素,并并移移动动到到下下一个元素上一个元素上 。yield break语句指定在序列中没有更多项。语句指定在序列中没有更多项。IL

17、istFindBobs(IEnumerable names)var bobs = new List();foreach(var currName in names)if(currName = Bob)bobs.Add(currName);return bobs;IEnumerable FindBobs(IEnumerable names)foreach(var currName in names)if(currName = Bob)yield return currName;传统的执行方法传统的执行方法1.调用函数调用函数2.函数执行并返回函数执行并返回list3.调用部分使用返回的调用部分使用返回的listYield的执行方法的执行方法1.调用函数调用函数2.调用者请求调用者请求item3.下一个下一个item返回返回4.回到步骤回到步骤2使用迭代器来创建枚举数

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号