自我理解foreach工作原理
很多时候我们在使用for循环遍历一个数组的时候,我们都知道可以通过下标的索引找到当前数组中所对应的数据。这只对于简单的数组或集合,如果我们存储的数据不止只有数据项,还有一个标识项,就如同Hashtable 和 Dictionary<key,value> 包含有key value键值对的时候,如果再去使用for循环就没有实际意义了。这种情况下就用到了foreach。有些博客上也有讲解到foreach实现的原理,foreach是被设计用来和可枚举类型一起使用。只要它的遍历对象是可枚举类型。如果一种类型的数据需要使用foreach来遍历数据,那么该类型就必须实现GetEnumerator()方法,具体实现GetEnumerator()可以通过实现IEnumerable接口来创建此方法。当使用foreach语句时,会通过GetEnumerator()方法返回一个枚举迭代器。通过该迭代器可以依次返回集合中项的类对象。从枚举数中请求每一项并且把它作为迭代变量,代码可以读但不可以改。

IEnuerator接口中通过MoveNext()方法和Current()方法来遍历数据。并返回迭代的数据。
2.使用IEnuerator接口中通过MoveNext()方法和Current()方法写自己的foreach()遍历数据。
1.首先建一个MyList类,想通过foreach()来遍历列表中的数据:让MyList类实现IEnumerable接口,创建GetEnumerator()方法,调用GetEnumerator()方法返回一个IEnumerator类型的迭代器,用于迭代列表中的数据,并且返回。
class MyList:IEnumerable
{
private List<string> _list = new List<string>();
public string this[int index]
{
get
{
return _list[index];
}
set
{
_list[index] = value;
}
}
public void Add(string value)
{
_list.Add(value);
}
public int Count()
{
return _list.Count;
}
public IEnumerator GetEnumerator()
{
return new MyListEnumerator(_list);
}
}
2.创建MyListEnumerator类实现IEnumerator 接口,用于遍历数据,并且返回IEnumerator 类型的数据。
class MyListEnumerator : IEnumerator
{
private List<string> _list;
public MyListEnumerator(List<string> list) //构造函数,初始化对象时传递一个list<string>集合
{
_list = list;
}
private int index = -1;//标识当前数据遍历到第几个位置
public object Current//获得当前对象
{
get
{
return _list[index];
}
}
public bool MoveNext()//如果还有下一个对象,则移动到下一个对象
{
if (index < _list.Count - 1)
{
index++;
return true;
}
else
{
return false;
}
}
public void Reset()//重置指针位置,指向第一个位置
{
index = -1;
}
}
通过迭代器把遍历的数据以对象的形式返回给调用方法。
MyList myList = new MyList();
myList.Add("北京");
myList.Add("上海");
myList.Add("河南");
//foreach (string item in myList)
//{
// Console.WriteLine(item);
//}
IEnumerator ator = myList.GetEnumerator();
while (ator.MoveNext())
{
string m = (string)ator.Current;
Console.WriteLine(m);
}
Console.ReadKey();
自我理解foreach工作原理的更多相关文章
- Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理
Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...
- Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理
Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理 计算机工作原理 汇编指令 C语言代码汇编分析 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程htt ...
- 通过一个小故事,理解 HTTPS 工作原理
本文摘录参考: 细说 CA 和证书(主要讲解 CA 的使用) 数字签名是什么?(简单理解原理) 深入浅出 HTTPS 工作原理(深入理解原理) HTTP 协议由于是明文传送,所以存在三大风险: 1.被 ...
- 理解 HTTPS 工作原理(公钥、私钥、签名、数字证书、加密、认证)(转)
本文摘录参考: 细说 CA 和证书(主要讲解 CA 的使用) 数字签名是什么?(简单理解原理) 深入浅出 HTTPS 工作原理(深入理解原理) HTTP 协议由于是明文传送,所以存在三大风险: 1.被 ...
- yum服务器搭建(深入理解yum工作原理)
作者:firefoxbug 时间:July 27, 2014 分类:Linux 前言 在前面一篇rpm包制作描述了rpm的打包过程,这篇文章主要讲述yum的工作原理. yum 运行原理 yum的工作需 ...
- 深入理解yum工作原理
前言 在前面一篇rpm包制作描述了rpm的打包过程,这篇文章主要讲述yum的工作原理. yum 运行原理 yum的工作需要两部分来合作,一部分是yum服务器,还有就是client的yum工具.下面分别 ...
- 理解Tomcat工作原理
WEB服务器 只要Web上的Server都叫Web Server,但是大家分工不同,解决的问题也不同,所以根据Web Server提供的功能,每个Web Server的名字也会不一样. 按功能分类,W ...
- 深入理解Cache工作原理
内容来源:https://zhuanlan.zhihu.com/p/435031232 内容来源:https://zhuanlan.zhihu.com/p/102293437 本文主要内容如下,基本涉 ...
- 理解channel 工作原理以及源码
Go 的并发特性 goroutines: 独立执行每个任务,并可能并行执行 channels: 用于 goroutines 之间的通讯.同步 一个简单的事务处理的例子 对于下面这样的非并发的程序: ...
随机推荐
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- Jquery实现图片左右滚动(自动)
<!DOCTYPE HTML><html><head><title>基于jQuery的控制左右滚动效果_自动滚动版本</title>< ...
- amf0解释一下
就简单记录一下省了以后忘了,amf0其实就几种数据格式的网络传输格式,比如数字,字符串,这些格式在传输的时候他给单独序列化了一下,主要支持以下这些: #define AMF0_NUMBER ((uin ...
- CentOS6.5升级为CentOS7.0
CentOS6.5升级为CentOS7.0 CentOS6.5升级为CentOS7 升级前: [root@localhost ~]# cat /proc/version Linux version ...
- 3 - testng.xml
TestNG的调用有以下几种方式: testng.xml ant 命令行 这部分主要介绍testng.xml的格式. 当前testng.xml的DTD(文档类型定义(Document Type Def ...
- 浏览器兼容性判定写法格式(ie)
条件注释判断浏览器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]> <!- ...
- PHP随机生成指定时间段的指定个数时间
/** * 生成某个范围内的随机时间 * @param <type> $begintime 起始时间 格式为 Y-m-d H:i:s * @param <type> $endt ...
- Python自动化运维之29、Bottle框架
Bottle 官网:http://bottlepy.org/docs/dev/index.html Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除 ...
- Webservices-1.web服务定义简介
一.WEB服务定义(摘自维基百科)详情:http://zh.wikipedia.org/wiki/Web%E6%9C%8D%E5%8A%A1 Web服务是一种服务导向架构的技术,通过标准的Web协议提 ...
- iOS类别(Category)与扩展(Extension)-b
苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #im ...