IEnumerator和IEnumerable接口

枚举器和可枚举类型
前面我们已经知道了使用foreach语句可以遍历数组中的元素。但是为什么那么做呢?
原因是数组按需提供了一个叫做枚举器的对象。枚举器可以依次返回请求数组中的元素。
枚举器知道项的次序并且跟踪它所在序列中的位置,然后返回请求的当前项。
获取一个对象枚举器的方法是调用对象的GetEnumerator方法。实现GetEnumerator方法的类型叫做可枚举类型。
数组是可枚举类型。
IEnumerator接口
实现了IEnumerator接口的枚举器包含3个函数成员:Current,MoveNext,Reset.
Current是返回序列中当前位置项的属性。
 它是只读属性
 它返回object类型的引用,所以可以返回任何类型。
MoveNext是把枚举器位置前进到集合中下一项的方法。它返回布尔值,指示新的位置是有效地位置还是已经
超过了序列的尾部。如果新的位置有效返回true,新的位置无效返回false.
枚举器的原始位置在序列中的第一项之前,因此MoveNext必须在第一次使用Current之前调用。
Reset是把位置重置为原始状态的方法。
IEnumerable接口
可枚举类是指实现了IEnumerable接口的类,IEnumerable接口只有有一个成员---GetEnumerator方法,他返回对象的枚举器。
using System.Collections;
class Myclass:IEnumerable
{public IEnumerator GetEnumerator{.....}
 //返回IEnumerator类型的对象
}
using System.Collections;//要加入这行代码

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] Myarray = { 10, 11, 12, 13 };//创建数组
            //System.Collections.IEnumerator ie = Myarray.GetEnumerator();//或者使用这个不用上面那个命名空间;
            IEnumerator ie = Myarray.GetEnumerator();
            while (ie.MoveNext())
            {
                int i = (int)ie.Current;
                Console.WriteLine("{0}",i);
            }
            Console.Read();
        }
    }
}
static void Main(string[] args)
        {
            int[] Myarray = { 10, 11, 12, 13 };//创建数组
            foreach(int i in Myarray)
               Console.WriteLine("{0}",i);

            Console.Read();
        }
上面的代码和foreach产生的效果一样的;
//使用IEnumerator和IEnumerable的示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;//要加入这行代码

namespace ConsoleApplication1
{
    class ColorEnumerator : IEnumerator
    {
        string[] color;
        int position = -1;
        private string color_2;
        public ColorEnumerator(string[] thecolor)//构造函数
        {
            color = new string[thecolor.Length];
            for (int i = 0; i < thecolor.Length; i++)
                color[i] = thecolor[i];
        }

        public ColorEnumerator(string color_2)
        {
            // TODO: Complete member initialization
            this.color_2 = color_2;
        }
        public object Current
        {
            get
            {
                if (position == -1)
                    throw new InvalidOperationException();
                if (position >= color.Length)
                    throw new InvalidOperationException();
                return color[position];
            }
        }
        public bool MoveNext()
        {
            if (position < color.Length - 1)
            {
                position++;
                return true;
            }
            else
                return false;
        }
        public void Reset()
        {
            position=-1;
        }

    }
    class Spectrum : IEnumerable
    {
        string []color={"111","222","333"};
        public IEnumerator GetEnumerator()
        {
            return new ColorEnumerator(color);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Spectrum spectrum = new Spectrum();
            foreach (string  str in spectrum)
               Console.WriteLine("{0}",str);

            Console.Read();
        }
    }
}

 
时间: 2024-10-05 12:27:01

IEnumerator和IEnumerable接口的相关文章

《转》IEnumerable、IEnumerator两个接口的认识

前言 IEnumerable.IEnumerator到现在为止对这两个接口还是不太理解,不理解但是自己总是想着试着要搞明白,毕竟自己用的少,所以在此先记录一下. 查看并使用两个接口 接下来我们先来看看两个接口的定义. 先来看一下IEnumerable接口,其实看过这个接口之后,发现它其实是非常的简单,只包含一个方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象,如下面截图所示: 这里的IEnumerator对象,其实就是另外一个接口,这个接口对象有什么呢

IEnumerable接口与IEnumerator接口

通过一个例子来看 -------------------------------------------------------Student.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace ConsoleApplication6 {  

foreach为什么要实现IEnumerable接口而不是直接用IEnumerator接口

在.Net中,要想被foreach遍历,那么目标对象要实现IEnumerable或IEnumerable<T>接口,这个接口有一个方法,GetEnumerator(),返回一个IEnumerator接口,这个接口里定义了Next()等方法,例如: public class Garge : IEnumerable { public IEnumerator GetEnumerator { return new A(); } internal class A : IEnumerator { //实现

你可能不知道的陷阱, IEnumerable接口

IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的for循环写得心烦,foreach就顺畅了很多. 我很喜欢这个接口,但在使用中也遇到不少的疑问,你是不是也有与我一样的困惑: (1) IEnumerable 与  IEnumerator到底有什么区别 (2) 枚举能否越界访问,越界访问是什么后果?为什么在枚举中不能改变集合的值? (3) Linq的具体实现到底是怎样的,比如Skip,它跳过了一些元素,那么这些

C# IEnumerator与 IEnumerable

1. 接口的使用 (1)  首先定义接口 public interface IBattleMapManager : { Stages CurrentStage { get; } event EventHandler<BeginFightEventArgs> EnterFight; } (2) 用定义实现类- 实现接口 public class BattleMapManager : IBattleMapManager, IDisposable { public Stages CurrentSta

C# 索引器,实现IEnumerable接口的GetEnumerator()方法

当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [修饰符] 数据类型 this[索引类型 index] 以下是代码 1 /// <summary> 2 /// 单元格 3 /// </summary> 4 public class Cell 5 { 6 /// <summary> 7 /// Value 8 /// <

IEnumerable接口

IEnumerable接口顾名思义就是 可枚举的,可列举的. 接口也很简单,返回一个 枚举器对象 IEnumerator . 1 [ComVisible(true), Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")] 2 public interface IEnumerable 3 { 4 [DispId(-4)] 5 IEnumerator GetEnumerator(); 6 } 7 8 9 10 只有一个GetEnumerator方法,返

在自己的对象里实现IEnumerator和IEnumerable

平时工作中我们经常用foreach来迭代一个集合.比如 1 foreach (Student student in myClass) 2 { 3 Console.WriteLine(student); 4 } 5 基本所有的集合都能够foreach,但是必须要实现IEnumerable接口.IEnumerable接口很简单,就只有一个IEnumerator GetEnumerator() 方法.看这个方法的定义就知道,仅仅是公开了另一个接口IEnumerator.而IEnumerator才是真正

IEnumerator和IEnumerable详解

IEnumerator和IEnumerable 从名字常来看,IEnumerator是枚举器的意思,IEnumerable是可枚举的意思. 了解了两个接口代表的含义后,接着看源码: IEnumerator: public interface IEnumerator { // Interfaces are not serializable // Advances the enumerator to the next element of the enumeration and // returns