C#发展到今天又三种方式实现迭代:

1、非泛型非 yield,这个较简单,代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace ConsoleApplication3
  9. {
  10. public class MyIterator:IEnumerable
  11. {
  12. public int[] testInt = new int[3] { 2, 56, 34 };
  13. public IEnumerator GetEnumerator()
  14. {
  15. return new MyEnumerator(this);
  16. }
  17. private class MyEnumerator : IEnumerator
  18. {
  19. private int currentIndex = -1;
  20. private int[] dataSource;
  21. public MyEnumerator(MyIterator mit)
  22. {
  23. this.dataSource = mit.testInt;
  24. }
  25. public bool MoveNext()
  26. {
  27. currentIndex++;
  28. return currentIndex < this.dataSource.Length;
  29. }
  30. public object Current { get { return this.dataSource[currentIndex]; } }
  31. public void Reset()
  32. {
  33. currentIndex = 0;
  34. }
  35. }
  36. }
  37. }

调用:

  1. MyIterator mi = new MyIterator();
  2. foreach (int i in mi)
  3. {
  4. Console.WriteLine(i);
  5. }
  6.  
  7. Console.ReadLine();

2、泛型方法实现,这个要写的代码比较多:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace ConsoleApplication3
  9. {
  10. public class MyIteratorGener : IEnumerable<int>
  11. {
  12. public int[] testInt = new int[] { , , };
  13. //实现的是泛型接口 IEnumerable<int> 里面的 IEnumerator<T> GetEnumerator();
  14. public IEnumerator<int> GetEnumerator()
  15. {
  16. return new MyEnumerator(this);
  17. }
  18. //由于 IEnumerable<int>继承IEnumerable,所以要实现IEnumerator GetEnumerator(); 这个,不然会报错
  19. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  20. {
  21. throw new NotImplementedException();
  22. }
  23. private class MyEnumerator : IEnumerator<int>, IDisposable
  24. {
  25. private int currentIndex = -;
  26. private int[] dataSource;
  27. public MyEnumerator(MyIteratorGener mit)
  28. {
  29. this.dataSource = mit.testInt;
  30. }
  31.  
  32. public bool MoveNext()
  33. {
  34. currentIndex++;
  35. return currentIndex < this.dataSource.Length;
  36. }
  37. //实现的是IEnumerator< T> 中的 T Current { [__DynamicallyInvokable] get; }
  38. public int Current { get { return this.dataSource[currentIndex]; } }
  39. // 由于IEnumerable<T>继承IEnumerable,两个接口的GetEnumerator方法同名
  40. // 所以对于非泛型的IEnumerable的GetEnumerator方法使用显式接口实现。
  41. // (如果IEnumerable<T>没有继承IEnumerable,那么一个只支持使用非泛型IEnumerable的
  42. // 方法将无法使用IEnumerable<T>)
    //不然会报错,未实现 object Ienumerator.Current
  43. object IEnumerator.Current { get { return this.dataSource[currentIndex]; } }
  44.  
  45. public void Reset()
  46. {
  47. currentIndex = ;
  48. }
  49. // IEnumerator<T>继承了IDisposable,为了遍历完后清理状态,所以需要实现该方法
  50. // 该方法在foreach循环完毕后自动调用
  51. public void Dispose()
  52. {
  53. }
  54. }
  55. }
  56. }

调用:

  1. MyIteratorGener mi = new MyIteratorGener();
  2. foreach (int i in mi)
  3. {
  4. Console.WriteLine(i);
  5. }
  6.  
  7. Console.ReadLine();

3、Yield return实现。C#2.0才可以   使用 yield break 结束一个迭代.

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace ConsoleApplication3
  9. {
  10. public class MyIteratorYield:IEnumerable
  11. {
  12. public IEnumerator GetEnumerator()
  13. {
  14. yield return ;
  15. yield return ;
  16. yield return ;
  17. }
  18. }
  19. }

调用:

  1. MyIteratorYield mi = new MyIteratorYield();
  2. foreach (int i in mi)
  3. {
  4. Console.WriteLine(i);
  5. }
  6.  
  7. Console.ReadLine();

C# Iterator迭代器的实现方式的更多相关文章

  1. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  2. Python 中 Iterator(迭代器)和Iterable(迭代对象)的区别

    直接可以用作for循环的数据类型有以下几种: tuple.list.dict.str等, 上述数据类型可以用作for循环的叫做可迭代对象Iterable.可以使用isinstance判断一个对象是否是 ...

  3. 使用Iterator迭代器循环集合

    1.Iterator迭代器用于遍历集合元素,获取迭代器可以使用. 2.Iterator提供了统一遍历集合元素的 方式 ,其提供了用于遍历集合的连个方法----- boolean  hasNext()判 ...

  4. Java集合、Iterator迭代器和增强for循环整理

    集合 集合,集合是java中提供的一种容器,可以用来存储多个数据. 数组的长度是固定的.集合的长度是可变的.集合中存储的元素必须是引用类型数据 1.1      ArrayList集合存储元素 pac ...

  5. Iterator迭代器

    java.util.Iterator 迭代器iterator,是一个接口,不能够直接使用,需要使用Iterator接口的实现类对象,而获取实现类的的对象的方式为: Collection接口中有一个方法 ...

  6. Java学习笔记28(集合框架二:Iterator迭代器)

    Iterator接口,翻译成中文是迭代器 迭代器的概念通俗解释: java中有很多的集合,内部有各种存储方法,取出的方式也各不相同,是否可以有一种通用的方式来获取呢? 这种方式类似for循环遍历, 通 ...

  7. 一、Iterator 迭代器

    需求:如何不适用for循环,依次遍历出数组中每个元素? 设计原理: 代码清单: 接口类 public interface Iterator { boolean hasNext(); Object ne ...

  8. JavaSE Collections类 , Iterator迭代器 , 增强for循环

    Collections 它是集合的工具类,为集合体系扩展了一些其他的方法.类中都是静态的方法,可以使用类名直接调用. 可变参数 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类 ...

  9. Iterator迭代器对象

    目录: >迭代器Iterator的使用 >迭代字符串集合 >迭代对象集合 >迭代器使用图解,和原理分析 >Java迭代器源代码 >迭代器Iterator的使用: & ...

随机推荐

  1. 清除系统日志及数据库(sql server)日志最佳实践

    在一个项目中遇到的问题:系统日志过大,后来用delete语句删除了(相当的慢),结果数据库日志又变成很大了(差不多10G),所以又得把数据库日志删除. 方法: --备份系统中的部份日志--SELECT ...

  2. git学习:多人协作,标签管理

    多人协作: 查看远程库的信息, git remote 推送分支到远程库 git push origin master/dev 注意:master是主分支,时刻需要与远程同步 dev是开发分支,也需要与 ...

  3. OAF_开发系列17_实现OAF数组应用Vector / Hashmap / Hashtable / Arraylist(案例)

    20150506 Created By BaoXinjian

  4. C#扇形的绘制与Hittest交互、图种制作

    C# 扇区的绘制与交互 哪位大神的杰作,代码里有,我就不废话了.源码下载方式如下. 注:将下面的图下载后,另存为.rar就可以看到图片中隐藏的代码程序了. 图种的制作 图种的目的在于隐藏文件.使得外人 ...

  5. Unable to find messages file 'cscui.dll' 问题解决

    之前在工作机器上安装VS 2015卡死,结束进程,安装失败一直无法使用,昨天下班开着电脑把VS 2015卸载了,今天早上来,以前正确的项目现在生成都报错 "Unable to find me ...

  6. Java课程

    链接: http://pan.baidu.com/s/1kU2n3wz 密码: r88d (封装,继承,多态) 1.JDK的安装和配置 2.HelloWorld 3.基本概念 4.数据类型 5.程序控 ...

  7. webpy 访问局域网共享资源

    遇到一个问题: 在python shell 中调用局域网远程共享文件时,没问题.但是在webpy中调用时,报错:没有权限.那一定是apache设置问题. 网上找不到类似的方法,于是换个思路搜了一下“p ...

  8. git的基础介绍和使用

    git工作原理 git的工作原理还是比较简单的,当我们创建了本地代码仓库后,会在本地代码仓库的根目录中生成一个.git的隐藏文件. .git为一个文件目录,又叫做版本库.在本地代码仓库文件夹中,除.g ...

  9. 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)

    几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floyd-Warshall算法(Floyd ...

  10. LeetCode 168. Excel Sheet Column Title

    Given a positive integer, return its corresponding column title as appear in an Excel sheet. -> A ...