`
bbls
  • 浏览: 61574 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

如何自己实现IEnumerable和IEnumerator接口以支持foreach语句

阅读更多

在C#中,凡是实现了IEnumerator接口的数据类型都可以用foreach语句进行迭代访问,可是,对于自定义类型如何实现这个接口以支持foreach的迭代呢?要实现这个功能,先来看看IEnumerable和IEnumerator接口的定义:

public interface IEnumerable
{
      //IEnumerable只有一个方法,返回可循环访问集合的枚举数。
      IEnumerator GetEnumerator()  ;
}
public interface IEnumerator

      // 方法
      //移到集合的下一个元素。如果成功则返回为 true;如果超过集合结尾,则返回false。
      bool MoveNext();
     // 将集合设置为初始位置,该位置位于集合中第一个元素之前
      void Reset();

      // 属性:获取集合中的当前元素
      object Current { get; }
}

如果我们的自定义数据类型派生于这两个接口,并实现接口中的方法,即可用foreach进行迭代。

下面是一个实现的简单例子:

using System;
using System.Collections ;
using System.Collections.Generic;
using System.Text;

namespace IEnumberableTest
{
    class Program
    {
        static void Main(string[] args)
        {
            myEnum enum1 = new myEnum(20);

            foreach ( point p in enum1)
            {
                Console.WriteLine("("+p.x .ToString ()+","+p.y.ToString ()+","+p.z.ToString ()+")");
            }

            Console.Read();
        }
    }

    //一个结构体,用于类myEnum
    struct point
    {
        public int x;
        public int y;
        public int z;
    }

    //我们的一个派生于IEnumerable和IEnumerator接口的自定义类
    class myEnum :IEnumerable,IEnumerator
    {
        //定义索引
        private int index;

        //定义一个point结构的数组
        private point[] points;

        //类的构造函数,用于初始化point结构数组
        public myEnum(int numofpoint)
        {
            this.index = -1;
            points = new point[numofpoint];

            for (int i = 0; i < points.Length ; i++)
            {
                points[i].x = i;
                points[i].y = i*i;
                points[i].z = i*i*i;
            }
        }

        //实现IEnumerable接口的GetEnumerator方法,返回一个IEnumerator,这里返回我们的自定义类,因为要对这个类的对象进行迭代
        public IEnumerator GetEnumerator()
        {
            return (IEnumerator)this;
        }

        //实现IEnumerator接口的Reset方法,将集合索引置于第一个元素之前
        public void Reset()
        {
            index = -1;
        }

        //实现IEnumerator接口的Current属性,返回一个自定义的point结构,即point数组的第index元素
        public object Current
        {
            get
            {
                return points[index];
            }
        }

        //实现IEnumerator接口的MoveNext方法,用于向前访问集合元素,如果超出集合范围,返回false
        public bool MoveNext()
        {
            index++;
            return index >= points.Length ? false : true;
        }

    }
}

分享到:
评论

相关推荐

    C# IEnumerable和IEnumerator接口浅析

    Foreach常用于循环访问集合,对实现IEnumerable的接口的容器进行遍历,IEnumerable和IEnumerator接口我有时候也有点迷糊,按官方的解释,IEnumerable是枚举器接口,IEnumerator是迭代器接口,从字面意思来看相差不大...

    C#自建类实现集合接口IEnumerable, IEnumerator

    C#自建集合类MyArrayList实现集合接口IEnumerable, IEnumerator, 实现方法 inr add(object value),void Remove(object o), int Count, void Clear()

    C#从foreach语句中枚举元素看数组详解

    GetEnumerator()方法返回一个实现lEnumerable接口的枚举,接着foreach语句就可以使用IEnumerable接口迭代集合了。 GetEnumerator()方法用IEnumerable接口定义,foreach语句并不真的需要在集合类中实现这个接口。有一...

    自定义类型实现系统接口的例子(一)

    实现IComparable和IComparer接口,IEnumerable和IEnumerator接口,IDisposable接口的例子。

    C#中可枚举类型详解

    我们经常使用的大多数集合实际上都已经实现了枚举的接口IEnumerable和IEnumerator接口,这样才能使用foreach迭代,有些是含有某种抽象了枚举细节的接口:ArrayList类型有索引,BitArray有Get方法,哈希表和字典有键...

    基于C#中IDisposable与IEnumerable、IEnumerator的应用

    本篇文章小编为大家介绍,基于C#中IDisposable与IEnumerable、IEnumerator的应用,需要的朋友参考下

    C# 编程基础

    (1)编写IEnglishDimensions和IMetricDimensions两个接口,同时以公制单位和英制单位显示框的尺寸。Box类继承IEnglishDimensions和...使用集合接口IEnumerable和Ienumerator实现装入水果过程及遍历水果。

    C#使用yield关键字让自定义集合实现foreach遍历的方法

    一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代器方法来实现foreach的遍历,且自定义...

    自写一个模仿Dictionary与Foreach的实现及心得总结

    利用闲暇时间自己写一个类模仿Dictionary实现,如果一个类进行foreach的话,该类必须实现IEnumerable,集合要支持foreach方式的遍历,必须实现IEnumerable接口,感兴趣的你可不要错过了哈

    yield总结与实例

    一、实现foreach的关键: 必须为包含有GetEnumerator()方法的对象 二、yield是一个语法糖,为方便开发者提供的一种方便方法 三、yield返回类型为IEnumerator、IEnumerable、IEnumerator、IEnumerable 四、如果返回...

    php和C#的yield迭代器实现方法对比分析

    本文实例讲述了php和C#的yield迭代器实现方法对比。...IEnumerable表示一个类可以迭代,也就是可以用foreach遍历,IEnumerator是真正的迭代器实现,IEnumerable和IEnumerator一个是使用迭代器的接口,一个是实现迭

    C#使用foreach语句遍历集合类型的方法

    本文实例讲述了C#使用foreach语句遍历集合类型的方法。分享给大家供大家参考。具体如下: 这里演示如何实现可与 foreach 语句一起使用的集合类 using System; using System.... // IEnumerable 接口实现: pu

    C# 简单分页,支持数据源DataTable和IEnumerable SourceCode

    简单的分页 “上一页”,“下一页”,“尾页”,“首页” 支持数据源DataTable和IEnumerable

    C#类可以通过foreach遍历的原理

     1、类要实现公共方法 public IEnumerator GetEnumerator(){},还可以继承IEnumerable接口来实现这个方法  2、类实现了 public IEnumerator GetEnumerator(){}中,要返回一个对象用于遍历的,当然这个对象必须...

    C#迭代器及Unity协程实例解析

    C#中的迭代器封装在IEnumerable和IEnumerator和他们的泛型接口中。 IEnumerable:定义了一个可以获取IEnumerator的方法—GetEnumerator()。 //IEnumerable的代码实现 public interface IEnumerable { ...

    C# 9.0新特性——扩展方法GetEnumerator支持foreach循环

    我们知道,我们要使一个类型支持foreach循环,就需要这个类型满足下面条件之一: 该类型实例如果实现了下列接口中的其中之一: System.Collections.IEnumerable System.Collections.Generic.IEnumerable System....

    C#中IEnumerable接口用法实例分析

    主要介绍了C#中IEnumerable接口用法,实例分析了IEnumerable接口的功能与使用技巧,需要的朋友可以参考下

    C#中的IEnumerable接口深入研究

    C#和VB.NET中的LINQ提供了一种与SQL查询类似的“对象查询”语言,对于熟悉...本人在最近的开发工作中使用了大量的这种特性,同时在调试过程中还遇到了一个小问题,那么正好趁此机会好好研究一下相关原理和实现。 先从

Global site tag (gtag.js) - Google Analytics