Foreach能够循环的本质
我们对foreach循环并不陌生,在C#中我们用得非常多,但是我们是否清楚foreach循环的本质呢? 众所周知,foreach循环能够遍历 数组 ,集合 。但是我们自己定义的一个类是否能够通过foreach循环遍历出来呢?
Foreach能够遍历的数据类型都是实现了 IEnumerable 接口的 意思就是说 只要我自定义的类实现了 IEnumberable接口 我都能够通过foreach来循环遍历
下面举一个简单的例子
首先自定义一个类 并实现 IEnumberable 接口
在Mylist类中,实现了IEnumberable接口后 必须 实现其中的 GetEnumberator()方法 而GetEnumberato方法中的返回值类型是 IEnumberator接口 类型
所以我们就自然而然想到了定义一个类 来实现 IEnumberator接口 利用里氏替换原则 返回子类类型
public class Mylist:IEnumerable
{
ArrayList list = new ArrayList();
//写一个自定义的Add方法()
public void Add(object ob)
{
list.Add(ob);
}
//实现IEnumerable接口的GetEnumerator()方法
public IEnumerator GetEnumerator()
{
return new MyTool(list);
}
}
/// <summary>
/// 实现 IEnumberyor接口时 必须实现该接口的 所有方法 即 Current() : 返回一个集合中的一项的值
/// MoveNext() : 系统自动调用MoveNext()方法
/// Reset() : 系统会在MoveNext方法返回一个false值的时候自动调用 将索引值重置
/// </summary>
public class MyTool : IEnumerator
{
ArrayList list = new ArrayList();
public MyTool(ArrayList li)
{
list=li;
}
int i = -;//给定初始位置 表示第一条数据之前
//Current属性
public object Current
{
get { return list[i]; }
} //自动调用MoveNext方法 调用下一条记录
public bool MoveNext()
{
bool Result = false;
if(i<list.Count-)
{
i++;
Result = true;
}
return Result;
} public void Reset()
{
i = -;
}
}
以上 foreach 循环的 本质 就是这些了
以下代码就是实现自定义类 用foreach循环实现
static void Main(string[] args)
{
Mylist list = new Mylist();
list.Add("张三");
list.Add("李四");
list.Add("王五"); foreach (object item in list)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
Foreach能够循环的本质的更多相关文章
- 编写高质量代码改善C#程序的157个建议——建议17:多数情况下使用foreach进行循环遍历
建议17:多数情况下使用foreach进行循环遍历 由于本建议涉及集合的遍历,所以在开始讲解本建议之前,我们不妨来设想一下如何对结合进行遍历.假设存在一个数组,其遍历模式可以采用依据索引来进行遍历的方 ...
- 7.15 迭代器 for循环的本质 生成器
迭代器 迭代:更新换代的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 作用 迭代器提供了一种不依赖于索引取值的方式 根据以上对于迭代的描述,如果只是简单的重复,不算迭代,如下: n ...
- C#的foreach遍历循环和隐式类型变量
C#的foreach遍历循环和隐式类型变量 foreach遍历循环 foreach (<baseType> <name> in <array>>) { //c ...
- Parallel.ForEach() 并行循环
现在的电脑几乎都是多核的,但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势. 微软的并行运算平台(Microsoft’s Parallel Computing ...
- 编写高质量代码改善C#程序的157个建议:第17个建议之多数情况下使用foreach进行循环遍历
今天是我看<编写高质量代码:改善C#程序的157个建议>第二遍的时候了,看完这本书的确是受益匪浅,学到了很多东西,也明白了很多道理. 里面的代码我每个都调试了一遍,有时候是有些出入的,可能 ...
- JSP页面通过c:forEach标签循环遍历List集合
c:forEach>标签有如下属性: 属性 描述 是否必要 默认值items 要被循环的信息 否 无begin 开始的元素(0=第一个元素,1=第二个元素) 否 0end 最后一个元素(0=第一 ...
- php 在foreach中循环数组的时候添加元素的属性
foreach($arr as $k => &$v){ //注意,由于上面遍历的时候写了地址传值符&, //所以下面可以直接给$v 赋值;如果不写&符号,下面这样写是没有 ...
- foreach控制循环if判断
<c:forEach items="${resultMap}" var="daily" varStatus="n"> <t ...
- foreach退出循环(新人请多多关照~)
今天做一个关于人员信息修改的页面时,我用foreach获取数据库数据时发现,用if else判断输入的内容时,会一个一个的做对比,导致错误提醒时会弹出与数据库内容行数相同条的提醒,最后发现将数据直接命 ...
随机推荐
- 解决微信浏览器无法使用reload()刷新页面
场景是这样子的,页面在初始化时有一个ajax请求,在页面上有一个按钮,点击的时候执行window.location.reload(),正常情况reload()后页面依然会向后台发出请求,但在安卓的微信 ...
- 仿iOS Segmented Control样式"
同步发表于http://avenwu.net/2015/02/05/styled_radiogroup_segmented_control Fork on github https://github. ...
- Ubunbu新建的用户使用SecureCrt无法Table补全、无法高亮
Check 两个地方: 1. 确保/etc/passwd中配置有/bin/bash (这个是用来控制补全). 2. 在~/.bashrc中配置, export TERM=linux (这个是用来控制 ...
- JSP中文乱码解决方案
学习JSP的过程中总会碰到中文乱码问题,有的是post方式提交没问题,用get方式提交有乱码,还有的是部署到tomcat中没问题,在Eclipse中启动tomcat,发现用get方式提交有乱码.产生乱 ...
- add .json handler support in IIS 7
Sometimes we need to create JSON in a text file with extension .json, however by default IIS 7 or an ...
- 在 Visual Studio 中打开编辑 cshtml 文件时出现错误:未能完成该操作 无效指针 的解决方法
第一步:关闭 Visual Studio: 第二步:删除 %LocalAppData%\Microsoft\VisualStudio\14.0\ComponentModelCache 下的所有文件: ...
- Struts2返回json
Action怎么返回json类型数据?方法1,使用struts2的插件struts2-json-plugin-2.3.8.jar(在下载的strut2库文件夹中). 在struts2.xml中对要返回 ...
- JS实现剪切板添加网站版权、来源
公司官网有这样需求,写好后,备份以后留用. 只兼容chrome.firefox.IE9+等主流浏览器. // https://developer.mozilla.org/en-US/docs/Web/ ...
- asp.net MVC 自动下载apk
在Asp.net MVC中直接把.apk文件放入/Upload/App/ 路径下,然后通过IIS发布完之后,再通过http://xxx/Upload/App/xx.apk访问是访问不到的,因此不能下载 ...
- 通过Jni实现AES的CBC模式加密解密
AES加密方式基本实现,出现一个问题就是代码的安全性.我们知道java层代码很容易被反编译,很有可能泄漏我们加密方式与密钥 内容,那我们该怎么办呢?我们可以使用c/c++实现加密,编译成So库的形式, ...