大话C#中能使用foreach的集合的实现

转自:http://www.cnblogs.com/tangzhengyue/p/3339936.html

 

大家都知道foreach的语法: foreach(var item in items) { Console.Writeln(item); }

通过这样一个简单的语句,就能实现遍历集合items中的所有元素。 那么,集合类(注意不是集合中的元素的类)是要满足什么条件才能用foreach遍历呢?

就像买衣服需要去找到卖衣服的人一样,要使用foreach,集合类必须要实现GetEnumerator()方法。

这里的GetEnumerator就相当于商城里的售货员,穿着统一的服装,任务就是买衣服(程序里的任务是实现遍历集合)。

当然了,售货员可以是个体户,也就是说,你可以自己直接实现GetEnumerator()方法;也可以是某个公司统一培训上岗的(程序里就是 实现了IEnumerable接口的。)只要是这个公司培训上岗的员工,一定是能够卖衣服。同理,只要实现了IEnumerable接口,就一定能够用 foreach遍历! 那么,实现了IEnumerable接口必然要重写GetEnumerator()方法。GetEnumerator()方法就让这个集合类获得了遍历的方法。 而这个遍历的方法是有一定的共性的,比如,获取当前索引对应的元素(GetCurrent)啦, 移动到下一个元素啦(MoveNext)啦,等等等等。 就好比买衣服培训一样,有一套统一的流程,大家卖衣服的流程都差不多(进货、上货、叫卖等等)。 既然这么有共性,那么就给封装成一个IEnumerator接口吧,这个接口里就包括获取当前索引对应的元素(GetCurrent)啦, 移动到下一个 元素(MoveNext)等等的方法,等待你去实现。这样,你只需要写一个实现了IEnumerator接口的类(假设是MyArrayEnumerator),构造函数里将你要写的集合类的 元素集合传进去处理。那么你再在集合类的GetEnumerator()方法里写上 return new MyArrayEnumerator()即完成了遍历集合的“上岗培训”。

总结就是:要使用foreach,集合类必须要实现GetEnumerator()方法,集合类是需要实现IEnumerator接口的类!!!!

可以使用foreach遍历循环的条件的更多相关文章

  1. java foreach遍历的前提条件

    自我总结,欢迎拍砖,不胜感激! 目的: 加深foreach遍历的影响 证明:foreach遍历的前提条件是:list !=null ,而不是:list !=null && list.s ...

  2. YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因

    YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因在YII框架的使用过程中,我们可以使用foreach直接遍历findAll等方法返回的对象的属性为什么呢?其实这与CMo ...

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

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

  4. c#--foreach遍历的用法与split的用法

    一. foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成.in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素.      该循环 ...

  5. 为什么数组没有实现Iterable接口,但可以使用foreach语句遍历

    在Java中,对于数组为什么能够使用foreach语句一直感觉很困惑. 对于能够使用foreach语句进行遍历的对象,只有两种情况,其中一种是遍历对象必须实现Iterable接口,实现ierator( ...

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

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

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

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

  8. php遍历循环数组实现方法

    简单利用foreach for list each while来遍历数组,包括普通的一维数组与二维数组遍历方法,下面详细的介绍了每个函数的使用方法. $foreach = array(1,2,3); ...

  9. python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器

    python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 1. 创建一个 zqxt_tm ...

随机推荐

  1. [洛谷P1903][国家集训队]数颜色

    题目大意:有$n$支画笔,有两个操作 $Q\;l\;r:$询问$[l,r]$中有几种颜色 $R\;p\;Col:$把第$p$支画笔的颜色改成$Col$ 题解:带修莫队,分为$n^{\frac{1}{3 ...

  2. Codeforces Round #418 (Div. 2) D. An overnight dance in discotheque

    Codeforces Round #418 (Div. 2) D. An overnight dance in discotheque 题意: 给\(n(n <= 1000)\)个圆,圆与圆之间 ...

  3. 洛谷 P2375 [NOI2014]动物园 解题报告

    P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...

  4. Android横竖屏切换生命周期

    转自xiaoQLuhttp://www.cnblogs.com/xiaoQLu/p/3324503.html 开源帮助android获得了飞速的发展,开源也导致了数不清的碎片问题.android的前期 ...

  5. HDU 1867 A + B for you again ----KMP

    题意: 给你两个字符串,输出他们合并之后的字符串,合并的时候把A的后缀和B的前缀重叠合(或者把A的前缀和B的后缀重合).要求合并后的串既包含A右包含B, 且使得合并后的字符串尽量短,其次是使得合并后的 ...

  6. 关于java1.7集合源码阅读

    工作中每天都会和java集合打交道,虽然以前也看过jdk源码的实现,但有些东西时间长了还是会遗忘,或者有些实现在新版本中有了新的变化,俗话说"温故而知新",所以打算再阅读一下相关源 ...

  7. hdu 2489(状态压缩+最小生成树)

    Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  8. Laravel 5.5 Blade::if 简介

    Laravel 5.5 引入了一个新的黑科技,就是你可以使用 Blade::if 来进行一些简单的逻辑判断啦!想不出应用场景在哪?想象下面的场景: 判断一个用户是否是 admin 判断应用的开发环境不 ...

  9. (转载)管道命令和xargs的区别(经典解释)

    一直弄不懂,管道不就是把前一个命令的结果作为参数给下一个命令吗,那在 | 后面加不加xargs有什么区别 NewUserFF 写道:懒蜗牛Gentoo 写道:管道是实现“将前面的标准输出作为后面的标准 ...

  10. (5)java基础知识2

    一.方法 方法相当于功能的实现. public   static   int          max    (int num1, int num2)   {....................} ...