我们对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. C变量类型和作用域

    C语言中所有变量都有自己的作用域,申明变量的类型不同,其作用域也不同.C语言中的变量,按照作用域的范围可分为两种, 即局部变量和全局变量. 一.局部变量 局部变量也称为内部变量.局部变量是在函数内作定 ...

  2. selenium实战练习之:粉丝反馈表单的自动化脚本

    链接 粉丝反馈表 要求 服务质量5颗星 喜欢的内容选择各种公开课 对交流群的意见需要填写 留下自己正确的联系方式 点击提交 断言 不需要断言,能符合上面的要求成功提交就可以

  3. 获取发布版SHA1获取

  4. [原]quick2.25让描边闪起来

    本文教大家如何使用shader让描边动起来.实质就是间隔一定时间改变描边的颜色.难点:如何通过程序把颜色传给shader.想在quick2.25里面尝试的朋友,参考quick2.25精灵变灰配置一下环 ...

  5. CSS基础(三):选择器

    常用选择器 元素选择器,即html标记如div,ul,li,p,h1~h6,table等. p { font-size:14px; } h1 { color:#F00; } 复合选择器, 由两个选择器 ...

  6. sqlserver 字符串最后一次的位置,截取字符串

    --reverse:字符串倒排 SUBSTRING(字段,1,len(字段)- CHARINDEX('-',REVERSE(字段)))

  7. iOS SDK Release Notes for iOS 9 iOS9 SDK 版本更新说明

    Important: This is a preliminary document for an API or technology in development. Apple is supplyin ...

  8. Redis和Memcached的区别

    From: https://www.biaodianfu.com/redis-vs-memcached.html Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储 ...

  9. Java框架篇---Mybatis 构建SqlSessionFactory

    从 XML 中构建 SqlSessionFactory 基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的.SqlSessionFactory 的实例可以通过 ...

  10. webkit特有的css属性

    内容参见:http://css-infos.net/properties/webkit 具体的定义网页里有详细说明.做有一些html5的应用的时候如果不能很好的适应手机,可以到这上面去找找方法-web ...