自我理解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 之间的通讯.同步 一个简单的事务处理的例子 对于下面这样的非并发的程序: ...
随机推荐
- kafka监控
做kafka相关项目,需要用到监控的东东,找到了两个方法 第一个: http://quantifind.com/KafkaOffsetMonitor/ 非常容易上手,效果也直观,可以显示各个topic ...
- 在2015中使用V12版本的ReportView控件,会导致winform窗体不能正常打开
在2015中使用V12版本的ReportView控件,会导致winform窗体不能正常打开,使用V10版本没问题,但2015中默认使用的就是V12版本,所以需要避免使用V12版本
- php基础知识【oop/mvc/orm/aop】
OOP 面向对象编程是一种计算机编程架构.OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成.OOP 达到了软件工程的三个主要目标:重用性.灵活性和扩展性.为了实现整体运 ...
- Windows Open with Sublime Text
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\Open with Sublime Text] "Icon&q ...
- 原生JS写Ajax的请求函数
一.JS原生ajax ajax:一种请求数据的方式,不需要刷新整个页面:ajax的技术核心是 XMLHttpRequest 对象:ajax 请求过程:创建 XMLHttpRequest 对象.连接服务 ...
- 转:Google技术开发指南:给大学生自学的建议
原文来自于:http://blog.jobbole.com/80621/ 技术开发指南 想要成为成功的软件工程师,必须拥有坚实的计算机科学的基础.本指南针对大学生,给出一条自学途径,让学生以科班和非科 ...
- City Game
hdu1505:http://acm.hdu.edu.cn/showproblem.php?pid=1505 题解:给你一个字符矩阵,里面有R和F两种字符,然后让你找一个最大的子矩阵,这个最大的子矩阵 ...
- ios入门之c语言篇——基本函数——3——判断日期是一年的第几天
3.判断日期是一年的第几天 参数返回值解析: 参数: y:int,年份: m:int,月份 d:int,日期 返回值: sum:传入日期是当年的第几天: 函数解析: leapyear(y);判断y是不 ...
- ZABBIX安装官方指南
慢慢,把这块业务要玩熟悉~~~~事前,事中,事后,它都能发挥自己的一些作用. From Zabbix official repository Zabbix SIA provides official ...
- Qt Creator Valgrind内存分析前端(分析Nginx内存)
Linux上使用Qt Creator进行C/C++开发http://my.oschina.net/eechen/blog/166969Qt Creator GDB调试前端(调试Nginx):http: ...