我们对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能够循环的本质的更多相关文章

  1. 编写高质量代码改善C#程序的157个建议——建议17:多数情况下使用foreach进行循环遍历

    建议17:多数情况下使用foreach进行循环遍历 由于本建议涉及集合的遍历,所以在开始讲解本建议之前,我们不妨来设想一下如何对结合进行遍历.假设存在一个数组,其遍历模式可以采用依据索引来进行遍历的方 ...

  2. 7.15 迭代器 for循环的本质 生成器

    迭代器 迭代:更新换代的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 作用 迭代器提供了一种不依赖于索引取值的方式 根据以上对于迭代的描述,如果只是简单的重复,不算迭代,如下: n ...

  3. C#的foreach遍历循环和隐式类型变量

    C#的foreach遍历循环和隐式类型变量 foreach遍历循环 foreach (<baseType> <name> in <array>>) { //c ...

  4. Parallel.ForEach() 并行循环

    现在的电脑几乎都是多核的,但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势. 微软的并行运算平台(Microsoft’s Parallel Computing ...

  5. 编写高质量代码改善C#程序的157个建议:第17个建议之多数情况下使用foreach进行循环遍历

    今天是我看<编写高质量代码:改善C#程序的157个建议>第二遍的时候了,看完这本书的确是受益匪浅,学到了很多东西,也明白了很多道理. 里面的代码我每个都调试了一遍,有时候是有些出入的,可能 ...

  6. JSP页面通过c:forEach标签循环遍历List集合

    c:forEach>标签有如下属性: 属性 描述 是否必要 默认值items 要被循环的信息 否 无begin 开始的元素(0=第一个元素,1=第二个元素) 否 0end 最后一个元素(0=第一 ...

  7. php 在foreach中循环数组的时候添加元素的属性

    foreach($arr as $k => &$v){ //注意,由于上面遍历的时候写了地址传值符&, //所以下面可以直接给$v 赋值;如果不写&符号,下面这样写是没有 ...

  8. foreach控制循环if判断

    <c:forEach items="${resultMap}" var="daily" varStatus="n"> <t ...

  9. foreach退出循环(新人请多多关照~)

    今天做一个关于人员信息修改的页面时,我用foreach获取数据库数据时发现,用if else判断输入的内容时,会一个一个的做对比,导致错误提醒时会弹出与数据库内容行数相同条的提醒,最后发现将数据直接命 ...

随机推荐

  1. <《巴菲特之道 (第三版)》>读书笔记

    以便宜的价格买入长期绩优的股票 他把对公司的投资看做是拥有公司的一部分股权,看重的是公司的长期经济价值 别人越是草率,我们越要加倍慎重 如果你发现自己已经在陷阱中,最重要的是想办法让自己不要再往下陷 ...

  2. 【WebMisCentral WMC】基于Extjs 4.2x的企业级用户授权认证中心系统(SSO+AM+SM),多租户SAAS应用

    http://saas.chinacloudtech.com 题记 三年磨一剑,在企业信息化的道路上已经走了3年之久了,3年多时间里做了很多,突破了很多:有无奈和辛酸,也有收货与喜悦:自我价值也在不断 ...

  3. Cocos2d-JS项目之一:环境(IDE 运行js-tests、IDE 和 studio 统一工程)

    环境:cocos 引擎(包括 studio)2.2.1 for Mac.cocos2d-js-v3.5.Cocos Code IDE 1.2 for Mac,cocos 引擎指的是下面这个东西: 各种 ...

  4. Unitils集成DBUnit、Spring-单元测试

    Unitils集成DBUnit.Spring-单元测试 1.maven-pom文件中引入相关jar包 <!-- Unitils -dbunit.Spring --> <depende ...

  5. 在unity5中减少Draw Calls(SetPass Calls)[转]

    在unity5中减少Draw Calls(SetPass Calls)   我一直工作于unity5支持的Standard Shader(标准着色器)上,并且做了一些关于如何有效地减少draw cal ...

  6. Android之TextView密码输入变星号时间

    private static class Visible extends Handler implements UpdateLayout, Runnable{ public Visible(Spann ...

  7. 实现让Lync client也能够"潜水"隐身聊天

    看到MSN或QQ,都支持隐身聊天. Lync Server  2013也是支持的.   1.Server端:Lync 2013 Server 缺省策略是没有设置显示脱机功能.(设置前截图)   2.直 ...

  8. slf4j日志系统

    slf4j:由外观模式实现,不是日志的解决方案,只是服务于各种各样的日志系统.可以让在应用部署的时候,选择合适的日志系统 slf4j + log4j : 配置日志文件:log4j.properties ...

  9. 配置 Sublime Text 用 Node.js 执行 JavaScript 程序

    1. 首先到 nodejs.org 下载 Node.js 安装包并安装. 2. 打开 Sublime Text 2 编辑器.选择菜单 Tools --> Build System --> ...

  10. Web services 安全 - HTTP Basic Authentication

    根据 RFC2617 的规定,HTTP 有两种标准的认证方式,即,BASIC 和 DIGEST.HTTP Basic Authentication 是指客户端必须使用用户名和密码在一个指定的域 (Re ...