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

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

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication3
{
public class MyIterator:IEnumerable
{
public int[] testInt = new int[3] { 2, 56, 34 };
public IEnumerator GetEnumerator()
{
return new MyEnumerator(this);
}
private class MyEnumerator : IEnumerator
{
private int currentIndex = -1;
private int[] dataSource;
public MyEnumerator(MyIterator mit)
{
this.dataSource = mit.testInt;
}
public bool MoveNext()
{
currentIndex++;
return currentIndex < this.dataSource.Length;
}
public object Current { get { return this.dataSource[currentIndex]; } }
public void Reset()
{
currentIndex = 0;
}
}
}
}

调用:

 MyIterator mi = new MyIterator();
foreach (int i in mi)
{
Console.WriteLine(i);
} Console.ReadLine();

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

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication3
{
public class MyIteratorGener : IEnumerable<int>
{
public int[] testInt = new int[] { , , };
//实现的是泛型接口 IEnumerable<int> 里面的 IEnumerator<T> GetEnumerator();
public IEnumerator<int> GetEnumerator()
{
return new MyEnumerator(this);
}
//由于 IEnumerable<int>继承IEnumerable,所以要实现IEnumerator GetEnumerator(); 这个,不然会报错
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
private class MyEnumerator : IEnumerator<int>, IDisposable
{
private int currentIndex = -;
private int[] dataSource;
public MyEnumerator(MyIteratorGener mit)
{
this.dataSource = mit.testInt;
} public bool MoveNext()
{
currentIndex++;
return currentIndex < this.dataSource.Length;
}
//实现的是IEnumerator< T> 中的 T Current { [__DynamicallyInvokable] get; }
public int Current { get { return this.dataSource[currentIndex]; } }
// 由于IEnumerable<T>继承IEnumerable,两个接口的GetEnumerator方法同名
// 所以对于非泛型的IEnumerable的GetEnumerator方法使用显式接口实现。
// (如果IEnumerable<T>没有继承IEnumerable,那么一个只支持使用非泛型IEnumerable的
// 方法将无法使用IEnumerable<T>)
//不然会报错,未实现 object Ienumerator.Current
object IEnumerator.Current { get { return this.dataSource[currentIndex]; } } public void Reset()
{
currentIndex = ;
}
// IEnumerator<T>继承了IDisposable,为了遍历完后清理状态,所以需要实现该方法
// 该方法在foreach循环完毕后自动调用
public void Dispose()
{
}
}
}
}

调用:

MyIteratorGener mi = new MyIteratorGener();
foreach (int i in mi)
{
Console.WriteLine(i);
} Console.ReadLine();

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

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication3
{
public class MyIteratorYield:IEnumerable
{
public IEnumerator GetEnumerator()
{
yield return ;
yield return ;
yield return ;
}
}
}

调用:

MyIteratorYield mi = new MyIteratorYield();
foreach (int i in mi)
{
Console.WriteLine(i);
} 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. HDU 2795 Billboard(区间求最大值的位置update的操作在query里做了)

    Billboard 通过这题,我知道了要活用线段树的思想,而不是拘泥于形式, 就比如这题 显然更新和查询放在一起很简单 但如果分开写 那么我觉得难度会大大增加 [题目链接]Billboard [题目类 ...

  2. hammerJs-v2.0.4详解

    一.前言 移动端框架当前还处在初级阶段,但相对于移动端的应用来说已经有很长时间了.虽然暂时还没有PC端开发的需求量大,但移动端的Web必然是一种趋势,在接触移动端脚本的过程中,最开始想到的是juqer ...

  3. Disconf

    通常我们会做如下配置:(disconf 2.6.21) <!-- 一次扫描 --> <bean id="disconfMgrBean" class="c ...

  4. sysbench压力测试工具简介和使用(二)

    sysbench压力测试工具使用: 2.1    测试数据库服务器的硬件配置信息如下: CPU:      24核心线程数,Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00G ...

  5. Java内存浅析分类

    当jvm运行起来的时候,它会向系统申请一片内存区(不同的jvm实现可能不同,有些可以使用虚拟内存),并将这块内存分出一部分存储程序创建的对象,传递给方法的参数,返回值,局部变量等等,我们将这块内存称之 ...

  6. 十、DG

    1.DG是dependency graph,我认为是依赖图,和DAG(有向无环图)的区别:DAG用来做场景管理,每个node代表的不是tranform就是shape,有父子关系. DG是代表了每个实体 ...

  7. Jmeter组件8. BeanShell Sampler

    BeanShell是一个小巧免费的JAVA源码解释器,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中,能动态执行JAVA源代码并为其扩展了脚本语言的一些特性,像JavaScript和perl那样 ...

  8. 关于ORACLE中配置文件的问题

    关于windows服务和oracle的问题的解决 <?xml version="1.0" encoding="utf-8"?><configu ...

  9. Mac与Phy组成原理的简单分析

    1. general 下图是网口结构简图.网口由CPU.MAC和PHY三部分组成.DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数据传输中. 对于上述的三部分 ...

  10. 初学Python之os模块

    OS模块是一个系统操作模块,是对本机的一些操作 os.name   显示操作系统,window:nt ,Linux/Unix:posix. os.getcwd()  显示运行的工作路径 os.list ...