`
bbls
  • 浏览: 63265 次
  • 性别: 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接口浅析

    在C#编程语言中,`IEnumerable`和`IEnumerator`接口是用于实现迭代和遍历集合的关键组件。这两个接口是.NET Framework中的基础部分,主要用于支持`foreach`循环结构。本文将深入解析这两个接口的工作原理和它们在...

    C#foreach原理

    如果该类型是一个泛型集合,还可能需要实现IEnumerable和IEnumerator接口以支持类型安全的枚举。 具体到代码实现,我们可以参考文章中给出的Person类的示例。Person类包含一个字符串数组_names,如果我们希望...

    数据结构 C#版 链表 加强版 支持 foreach语句

    // 实现IEnumerable接口以支持foreach public IEnumerator&lt;ListNode&gt; GetEnumerator() { ListNode current = head; while (current != null) { yield return current; current = current.Next; } } ...

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

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

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

    IDisposable接口、IEnumerable接口和IEnumerator接口是C#中用于处理资源清理和迭代操作的关键组件。本文将深入探讨这些接口的使用及其在实际开发中的应用。 首先,IDisposable接口是C#中用于处理非托管资源释放的...

    C#中foreach语句深入研究

    迭代器是一个实现了`IEnumerable`接口的对象,这个接口定义了一个`GetEnumerator`方法,返回一个实现了`IEnumerator`接口的对象。`IEnumerator`接口包含`Current`属性(用于获取当前元素)和`MoveNext`方法(用于...

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

    总结起来,C#的`foreach`语句遍历集合类型的核心在于实现`IEnumerable`接口和相应的`IEnumerator`枚举器。通过这样的设计,我们可以轻松地遍历任何类型的集合,无论是内置的还是自定义的,从而提高了代码的可读性...

    C#中foreach实现原理详解

    通过实现IEnumerable接口和IEnumerator接口,我们可以自定义一个迭代器,使其可以用foreach语句来遍历集合。 C#中foreach的实现原理基于可枚举类型和枚举器的概念。枚举器对象负责遍历集合中的每个元素,并提供当前...

    c#面试题集锦

    class可以继承自抽象类和实现接口。 4. try-catch-finally中的finally块 finally块是在try块和catch块之后执行的代码,即使try块中有return语句,finally块仍然会执行。finally块通常用于释放资源和关闭文件等。 ...

    Net面向对象程序设计枚举集合PPT学习教案.pptx

    面向对象程序设计在.NET框架中是一个核心概念,它允许开发者以更加抽象和模块化的方式处理复杂的软件问题。...通过实现`IEnumerable`和`IEnumerator`接口,开发者可以扩展这一机制,为自定义类型提供迭代能力。

    C程序设计资料全集PPT课件.pptx

    数组Array、ArrayList等实现IEnumerable接口的类都可以用在foreach语句中。IEnumerator接口包含了Current属性(获取当前元素)、MoveNext方法(移动到下一个元素)和Reset方法(重置到初始位置)。 **ICollection...

    Net面向对象程序设计枚举集合PPT课件.pptx

    面向对象程序设计中的枚举集合是.NET框架中的一个重要概念,主要涉及到枚举器(Enumerator)和可枚举类型(Enumerable)。...通过理解这些概念,开发者能够更好地设计和实现各种数据结构,提高代码的可读性和性能。

    一个ForEach管理类

    在.NET框架中,`foreach`循环是通过实现`IEnumerable`和`IEnumerator`接口来支持的。然而,有时候我们可能需要自定义一些行为,这时就需要创建自己的`ForEach`管理类。这个"一个ForEach管理类"项目正提供了这样一个...

    foreach用法.pdf

    `foreach` 不仅适用于数组,还适用于实现了 `IEnumerable` 或 `IEnumerator` 接口的任何类型,包括列表、队列、堆栈等。这是 C# 面向对象编程的一大优势。 6. **迭代器**: `foreach` 的强大之处还在于它支持...

    net中级程序员面试题

    2. 用户类若想支持 Foreach 语句需要实现的接口是:IEnumerable 或 IEnumerator。Foreach 语句可以用来枚举集合中的元素,而 IEnumerable 和 IEnumerator 是实现枚举的两个关键接口。 3..Net Framework 通过什么与 ...

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

    它省去了实现接口的繁琐工作,降低了代码复杂性,同时也使得代码更易于理解和维护。在处理大量数据或者需要按需生成数据的场景下,`yield`关键字尤其有用,因为它可以延迟计算和内存分配,提高程序性能。通过深入...

    C#:foreach与yield语句的介绍

    在C#编程语言中,`foreach`语句和`yield`关键字是两个非常重要的概念,它们主要用于处理集合数据和实现自定义迭代。下面将详细介绍这两个语句及其应用。 1. `foreach`语句 `foreach`循环用于遍历可迭代对象,如数组...

    unity3D简单项目分析.docx

    五是迭代器的返回类型必须为 IEnumerable 和 IEnumerator 中的任意一种;六是迭代器是产生值的有序序列的一个语句块,不同于有一个或多个 yield 语句存在的常规语句块;七是迭代器不是一种成员,它只是实现函数成员...

    理解Enumerator

    枚举器(Enumerator)在C#...枚举器的实现可以利用`yield return`来提供延迟执行和迭代控制,而`foreach`则提供了简洁的语法糖来遍历任何实现了`IEnumerable`接口的对象。理解这些概念对于深入学习C#和.NET框架至关重要。

Global site tag (gtag.js) - Google Analytics