[C#2] 5-迭代器
时间:2022-04-23
本文章向大家介绍[C#2] 5-迭代器,主要内容包括1.枚举数、2.迭代器、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
1.枚举数
枚举数是循环访问其关联集合的对象。它可被视作指向集合中任何元素的可移动的指针。 一个枚举数只能与一个集合关联,但一个集合可以具有多个枚举数。C#的foreach 语句使用枚举数并隐藏操作该枚举数的复杂性。枚举数可用于读取集合中的数据,但不能用于修改基础集合。
集合要支持foreach则需要实现System.Collections.IEnumerable接口[公开枚举数,该枚举数支持在非泛型集合上进行简单迭代, 也可以不实现该接口,该接口定义了一个方法GetEnumerator(),返回一个支持IEnumerator接口的对象,IEnumerator的成员如下:
名称 |
说明 |
---|---|
bool MoveNex t方法 |
将枚举数推进到集合的下一个元素 |
void Rese t方法 |
将枚举数设置为其初始位置,该位置位于集合中第一个元素之前 |
object Current 属性 |
获取集合中的当前元素 |
写一个:
1
2 public class MyCollections : IEnumerable
3 {
4 private string[] items;
5 MyCollections(string[] items)
6 {
7 this.items = items;
8 }
9 public IEnumerator GetEnumerator()
10 {
11 return new MyEnumerator(this);
12 }
13 public class MyEnumerator : IEnumerator
14 {
15 private int position = -1;
16 private MyCollections mc;
17 public MyEnumerator(MyCollections mc)
18 {
19 this.mc = mc;
20 }
21 public bool MoveNext()
22 {
23 if (position < this.mc.items.Length - 1)
24 {
25 position++;
26 return true;
27 }
28 else
29 {
30 return false;
31 }
32 }
33 public void Reset()
34 {
35 position = -1;
36 }
37 object IEnumerator.Current
38 {
39 get
40 {
41 return this.mc.items[position];
42 }
43 }
44 }
45 static void Main()
46 {
47 MyCollections f = new MyCollections(
48 new string[] { "乱舞春秋", "男", "22" });
49 foreach (string item in f)
50 {
51 Console.WriteLine(item);
52 }
53 }
54 }
2.迭代器
C#2.0以前,要使自己的集合支持foreach遍历,需要写上面一大堆代码[实现两个接口,也可不实现, 但是必须给提供这两个接口中的同名方法],C#2.0引入了yield return[返回每个元素]和yield break[终止迭代]两个组合而成的上下文关键字。 改写上述代码:
//MyEnumerable方法全部删掉
public IEnumerator GetEnumerator()
{
for (int i = 0; i < items.Length; i++)
{
yield return items[i];
}
}
就是这么简单!只需实现一个接口IEnumerable就可以了[或者说有public IEnumerator GetEnumerator()此方法就可];
像是匿名方法一样,编译器帮我们做了很多[这里编译器帮我们生成了"实现IEnumerator接口的一个类",通过查看IL代码得知]。
- 一次ORA-00600问题的排查和分析(r5笔记第64、65天)
- SpringMVC入门就这么简单
- pl/sql中的forall简单测试(r5笔记第63天)
- SpringMVC【开发Controller】详解
- 巧用外部表备份历史数据(r5笔记第62天)
- Github 项目推荐 | 最小化类 AlphaGo Zero 引擎 —— Nochi
- 半自动化运维之快速连接到指定环境(一) (r5笔记第61天)
- Spring【DAO模块】知识要点
- 浅谈exp/imp(上) (r5笔记第81天)
- Java高并发秒杀系统【观后总结】
- 【专业技术】引擎算法探究
- 阅读SSM项目之scm
- 阅读SSH项目之ERP
- Hybris商品图片导入与压缩有关的配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在tensorflow以及keras安装目录查询操作(windows下)
- Python调用OpenCV实现图像平滑代码实例
- php微信公众号开发之音乐信息
- Laravel关联模型中过滤结果为空的结果集(has和with区别)
- php微信公众号开发之二级菜单
- django中的ajax组件教程详解
- php微信公众号开发之校园图书馆
- 查看keras的默认backend实现方式
- Python包和模块的分发详细介绍
- PHP cookie,session的使用与用户自动登录功能实现方法分析
- Python内置方法和属性应用:反射和单例(推荐)
- 使用OpenCV对车道进行实时检测的实现示例代码
- php 读取文件夹下所有图片、文件的实例
- php微信公众号开发之欢迎老朋友
- Linux基于php-fpm模式的lamp搭建phpmyadmin的方法