自我理解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 之间的通讯.同步 一个简单的事务处理的例子 对于下面这样的非并发的程序: ...
随机推荐
- Android 学习手札(一) 应用程序架构
1.资源列表 Android支持的资源列表 目 录 资源类型 描述 res/anim XML 该目录用于存放帧(frame).动画或补间(tweened)动画文件 res/drawable ...
- 一站式远程页面调试工具spy-debugger 2.0,已支持HTTPS
项目名称: spy-debugger 项目地址:https://github.com/wuchangming/spy-debugger 关于spy-debugger npm Build Status ...
- phpexcel 一些基本的设置 (表格的基本属性)
网址是:http://www.thinkphp.cn/code/1893.html
- rpmbuild构建包时的宏定义的赋值
rpmbuild -bb SPECS/git.spec --define="_topdir `pwd`" rpmbuild --rebuild SRPMS/git.src.rp ...
- Typefaces and Personalities (字体与性格)
Boring afternoon, searching something fun. See this article What Your Favorite Font Says About You , ...
- 使用ToUpperInvariant避免使用ToUpper
ToUpperInvariant使用不依赖于区域性进行转换,而ToUpper则使用了当前线程的CultureInfo,进行转换,所以性能会有所影响,以下为测试: [Test] public void ...
- 开发Nginx模块
开发Nginx模块 前面的哪些话 关于Nginx模块开发的博客资料,网上很多,很多.但是,每篇博客都只提要点,无法"step by step"照着做,对于初次接触Nginx开发的同 ...
- jquery.js 库中的 选择器
<html><head><script type="text/javascript" src="jquery.js">< ...
- Adobe Photoshop CS或者CC卸载不了怎么办?
有木有没有遇到这个问题的同学?使用Adobe Creative Suite CleanerToo工具下载就好了~ 下载地址:http://pan.baidu.com/s/1pJ3aBsn
- CVE-2015-1635,MS15-034 漏洞测试
HTTP.sys远程执行代码漏洞(CVE-2015-1635,MS15-034) 远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 H ...