版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、19.1枚举集合(jh)中的元素 foreach语句极大的简化( jinhu)了需要编写的代码 int pins = 9, 3, 7, 2 ; foreach (int pin in pins) Console.WriteLine(pin); 为什么数组可以这么做呢? 数组可以按需提供一个叫做枚举器的对象,枚举器可以依次返回请求的数组的元素 枚举器指导项的次序并且跟踪它在序列中的位置,然后返回请求的当前项第1页/共28页第一页,共29页。 对于枚举器的类型而言,必须有一个方法来获取它们 在.net中获取一个对象(duxing)枚举器的标准方法是调用对象(duxing)的GetEnumerato
2、r方法 凡是实现了GetEnumerator方法的类型叫做可枚举类型enumerable第2页/共28页第二页,共29页。 可枚举的集合:实现(shxin)了System.Collections .IEnumerable接口的一个集合 C#中所有数组都是System.Array类的实例 该类是实现(shxin)了IEnumerable接口的一个集合类 在IEnumerable接口中,包含一个名为GetEnumerator的方法: IEnumerator GetEnumerator();第3页/共28页第三页,共29页。 GetEnumerator方法(fngf)返回一个枚举器对象,该枚举器实现
3、了System.Collections .IEnumerable接口 枚举器对象用于遍历集合中的元素 IEnumerator接口指定了以下方法(fngf)和属性: object Current get; bool MoveNext(); void Reset();第4页/共28页第四页,共29页。 foreach结构被设计用来和可枚举类型一起使用,只要给他的遍历对象是可枚举类型,比如数组,它会执行以下操作: 通过调用GetEnumerator方法获取对象的枚举器 从枚举器中请求每一项并且把它作为迭代(di di)变量第5页/共28页第五页,共29页。枚举(mi j)器类型 枚举器一共有三种,工
4、作原理相同,但有一些细小的区别 IEnumerator/IEnumerable接口非泛型接口形式(xngsh) IEnumerator/IEnumerable接口泛型接口形式(xngsh) 不使用接口形式(xngsh)第6页/共28页第六页,共29页。2、使用(shyng)IEnumerator 接口 IEnumerator接口包含三个函数成员:Current、MoveNext以及Reset。 Current返回序列中当前位置项的属性。 它是只读属性。 它返回object类型的引用,所以可以返回任何类型。 MoveNext是把枚举数位置前进到集合中下一项的方法。它也返回布尔值,指示新的位置是有
5、效位置或已经超过(chogu)了序列的尾部。 如果新的位置是有效的,方法返回true。 如果新的位置是无效的(比如到达了尾部),方法返回false 枚举数的原始位置在序列中的第一项之前。MoveNext必须在第一次使用Current之前使用,否则CLR会抛出一个InvalidOperationException异常。 Reset方法把位置重置为原始状态。第7页/共28页第七页,共29页。枚举(mi j)数类通常被声明为类中的嵌套类第8页/共28页第八页,共29页。 枚举数与序列中的当前项保持联系的方式完全取决于实现。可以通过对象引用、索引(suyn)值或其他方式来实现。对于数组来说,就使用项的
6、索引(suyn)。第9页/共28页第九页,共29页。 有了集合的枚举数,我们就可以使用MoveNext和Current成员来模仿foreach循环遍历集合中的项。 例如(lr)数组就是可枚举类型,所以下面的代码手动做foreach语句自动做的事情。输出和使用foreach循环的输出一样。第10页/共28页第十页,共29页。 要创建非泛型接口的枚举数类,必须声明实现IEnumerator接口的类。 IEnumerator接口有如下的特性: 它是System.Collection命名空间的成员(chngyun)。 它包含三个方法Current、MoveNext和Reset。非泛型枚举(mi j)数
7、类的框架第11页/共28页第十一页,共29页。示例:实现(shxin)一个列出颜色名数组的枚举类型第12页/共28页第十二页,共29页。3、IEnumerable 接口(ji ku) IEnumerable接口只有一个(y )成员GetEnumerator方法,它返回对象的枚举数。第13页/共28页第十三页,共29页。使用(shyng)IEnumerable 和IEnumerator 的示例第14页/共28页第十四页,共29页。第15页/共28页第十五页,共29页。4、不实现接口(ji ku)的枚举数 使用IEnumerable和IEnumerator接口可以创建可枚举类型和枚举数,但是这种方
8、法有几个缺点: 首先,由Current返回的对象是object类型的。对于值类型而言,在由Current返回之前必须装箱成object。在从Current获取之后,又必须再一次拆箱。如果需要操作大量的数据,会带来严重的性能问题。 非泛型接口方法的另外一个缺点是失去(shq)了类型安全。值被作为对象来枚举,所以可以是任何类型。这就消除了编译时的类型检测解决方法:对于枚举数类:不要继承自IEnumerator。像以前一样实现MoveNext。像以前一样实现Current,把返回类型设置(shzh)为和枚举的项一样。不需要实现Reset。对于可枚举类:不要继承自IEnumerable。像以前一样实现
9、GetEnumerator,设置(shzh)返回值为枚举数类。第16页/共28页第十六页,共29页。比较基于接口( ji ku)的和非基于接口( ji ku)的枚举数第17页/共28页第十七页,共29页。5、泛型枚举(mi j)接口 第三种形式(xngsh)的枚举数是使用泛型接口IEnumerable和IEnumerator。 对于非泛型接口形式(xngsh): IEnumerable接口的GetEnumerator方法返回实现IEnumerator枚举数类的实例。 实现IEnumerator的类实现了Current属性,它返回object的引用,我们必须把它转化为实际类型的对象。 对于泛型接
10、口形式(xngsh): IEnumerable接口的GetEnumerator方法返回实现IEnumator的枚举数类的实例。 实现IEnumerator的类实现了Current属性,它返回实际类型的对象,而不是object基类的引用。第18页/共28页第十八页,共29页。6、IEnumerator接口(ji ku) IEnumerator接口使用泛型来返回实际的类型,而不是object类型的对象。 IEnumerator接口从另外两个接口继承非泛型IEnumerable接口和IDisposable接口。所以,它肯定实现了它们的成员。 IEnumerator接口本身只有一个Current方法,
11、它返回衍生类型的项不是object类型的项。 由于IEnumerator和IEnumerator都有一个叫做Current的成员,我们应该显式实现IEnumerator版本(bnbn),然后在类中实现泛型版本(bnbn)第19页/共28页第十九页,共29页。如下代码(di m)使用泛型枚举数接口来实现ColorEnumerator实例第20页/共28页第二十页,共29页。7、IEnumerable接口(ji ku) 泛型IEnumerable 接口( ji ku)与IEnumerable 的非泛型版本很相似。 泛型版本从IEnumerable继承,所以也必须实现IEnumerable接口( j
12、i ku)。第21页/共28页第二十一页,共29页。如下代码(di m)演示了泛型可枚举接口的使用:第22页/共28页第二十二页,共29页。8、迭代(di di)器 为了将一个集合变得“可枚举”,其过程非常复杂 C#从2.0版本开始提供了更简单的创建枚举数和可枚举类型的方式。 编译器会为我们创建它们,这种结构叫做迭代器 迭代器(iterator)是能生成(yield)已排序值序列的一个代码块 注意(zh y):iterator实际并不是一个可枚举类的成员,相反,它只是指定了一个序列,枚举器应该用这个序列来返回其中的值 即,迭代器只是对枚举序列的一个描述,C#编译器可以利用它来创建自己的枚举器第
13、23页/共28页第二十三页,共29页。19.2.1 一个(y )简单的迭代器using System;using System.Collections.Generic;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()
14、foreach (var datum in data) yield return datum; IEnumerator IEnumerable.GetEnumerator() / 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);第24页/共28页第二十四页,共29页。 迭代器块是有一个或多个
15、yield语句的代码块。下面三种类型的代码块中的任意一种都可以是迭代器块: 方法主体 访问器主体 运算符主体 迭代器块被认为与其他代码块不同。 其他块包含的语句被当作(dn zu)是命令式的。即,代码块的第一个语句被执行然后是后面的语句,最后控制离开块。 迭代器块不是需要在同一时间执行的一序列命令式语句,而是描述了希望编译器为我们创建的枚举数类的行为。 迭代器块中的代码描述了如何枚举元素。迭代器返回一个(y )泛型枚举数,该枚举数返回三个string类型的项。yield return语句声明这是枚举中的下一项。迭代器块有两个特殊语句:yield return;返回集合的一个(y )元素,并移动
16、到下一个(y )元素上 。yield break语句指定在序列中没有更多项。第25页/共28页第二十五页,共29页。IListFindBobs(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;传统的执行(zhxng)方法1.调用函数2.函数执行(zhxng)并返回list3.调用部分使用返回的listYield的执行方法1.调用函数2.调用者请求item3.下一个(y )item返回4.回到步骤2第26页/共28页第二十六页,共29页。使用迭代器来创建(chungjin)枚举数第27页/共28页第二十七页,共29页。谢谢您的观看(g
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 空压系统基本知识介绍
- 灭鼠除虫业务培训课件
- 医疗废物规范管理培训课件
- 2026安徽马鞍山郑蒲港新区管委会面向全省选调事业单位人员3人备考题库含答案详解(培优a卷)
- 职业卫生教育培训管理制度(2篇)
- 2026新版《安全生产法》考试题库含答案
- 食品企业卫生安全管理制度
- 2026广东深圳市宝安区水田实验学校诚聘初中小学数学教师备考题库及答案详解(基础+提升)
- 2026年河南省事业单位公开招聘联考备考题库附参考答案详解(巩固)
- 2026宁夏公务员考试备考题库(984人)带答案详解ab卷
- 《审计法》修订解读
- 医院药品目录(很好的)
- 文化墙设计制作合同书两份
- 2023年内蒙专技继续教育学习计划考试答案(整合版)
- 《通信工程制图》课程标准
- 石油天然气建设工程交工技术文件编制规范(SYT68822023年)交工技术文件表格仪表自动化安装工程
- 配对齿轮参数全程计算(史上最全最好用的齿轮计算表格)
- 马鞍山市恒达轻质墙体材料有限公司智能化生产线环保设施改造项目环境影响报告表
- GB/T 26332.6-2022光学和光子学光学薄膜第6部分:反射膜基本要求
- GB/T 3098.1-2010紧固件机械性能螺栓、螺钉和螺柱
- GA/T 944-2011道路交通事故机动车驾驶人识别调查取证规范
评论
0/150
提交评论