C# Iterator迭代器的实现方式

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[3] { 2, 56, 34 };
        //实现的是泛型接口 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 = -1;
            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 = 0;
            }
            // 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 2;
           yield return 56;
           yield return 34;
        }
    }
}

调用:

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

            Console.ReadLine();
时间: 2024-10-09 23:45:09

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

Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1)Iterator定义有三个方法: ①boolean hasNext()方法:判断指针后面是否有元素. ②E next()方法:指针后移,并返回当前元素.E代表泛型,默认为Object类型. ③void remove()方法:在原集合中删除刚刚返回的元素. 2)对于List集合而言,可以通过基于下标的

Iterator - 迭代器模式

定义 提供一个方法顺序访问一个聚合对象中个各个元素,而又不需要暴露该对象的内部结构. 案例 一个聚合对象,如一个列表List,应该提供一种方法来让别人可以访问它的元素,而又不用暴露内部结构.迭代器模式可以很好的解决这类问题,关键思想就是将队列表的访问和遍历从列表对象中分离出来,放到一个迭代器Iterator对象中,Iterator定义了一个访问List对象的接口. AbstractList提供了List的基本接口: template<class Item> class AbstractList

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

设计模式17:Iterator 迭代器模式(行为型模式)

Iterator 迭代器模式(行为型模式) 动机(Motivation) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透明地访问其包含的元素:同时这种“透明变量”也为“同一种算法在多种集合对象上进行操作”提供了可能. 使用面向对象技术使这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式. 意图(Intent)提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示.——

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

1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用户界面框架中的 Window 对象可以收集任意数量的控制对象 - Menu.Slider 和 Button.并且,集合的实现可以有多种方式:PHP 数字是一个集合,但也是一个散列表,一个链接列表,一个堆栈以及队列. 例子1:电视遥控器的频道遍历 2.问题 如何操纵任意的对象集合? 如一个列表(Lis

使用Iterator迭代器循环集合

1.Iterator迭代器用于遍历集合元素,获取迭代器可以使用. 2.Iterator提供了统一遍历集合元素的 方式 ,其提供了用于遍历集合的连个方法----- boolean  hasNext()判断集合是否还有元素可以遍历, E next()返回迭代的下一个元素 .

Iterator迭代器对象

目录: >迭代器Iterator的使用 >迭代字符串集合 >迭代对象集合 >迭代器使用图解,和原理分析 >Java迭代器源代码 >迭代器Iterator的使用: >迭代字符串集合 import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * 集合的迭代 * * Iterator iterator() 集合的专用迭代器 * E next()获取指针当

day191、集合 2、Iterator迭代器 3、增强for循环 4、泛型

今日内容介绍 1.集合 2.Iterator迭代器 3.增强for循环 4.泛型 =======================第一节课开始============================================= ###01集合使用的回顾 *A:集合使用的回顾 *a.ArrayList集合存储5个int类型元素 public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<

Java的集合、Iterator迭代器

1.集合(1)集合存储的元素必须是引用类型数据[自动装箱(基本类型->包装类)]jdk1.5版本之后 建立一个  demo01  类 package com.oracle.demo01; public class demo01 { private String name; private Integer age; public demo01() { super(); } public demo01(String name, Integer age) { super(); this.name =