IEnumerator和IEnumerable接口

枚举器和可枚举类型

前面我们已经知道了使用foreach语句可以遍历数组中的元素。但是为什么那么做呢?

原因是数组按需提供了一个叫做枚举器的对象。枚举器可以依次返回请求数组中的元素。

枚举器知道项的次序并且跟踪它所在序列中的位置,然后返回请求的当前项。

获取一个对象枚举器的方法是调用对象的GetEnumerator方法。实现GetEnumerator方法的类型叫做可枚举类型。

数组是可枚举类型。
foreach(type varname in EnumerableObject){....}第二个参数必须为可枚举类型
foreach结构设计用来和可枚举类型一起使用,只要给出它的遍历对象是可枚举类型,他就会执行以下行为:

通过调用getenumrator方法获取对象的枚举器;

从枚举器中请求每一项并且把它作为迭代变量(iteration variable),代码是可读取该变量但从不改变。

IEnumerator和IEnumerable接口 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();

        }

    }

}
IEnumerator和IEnumerable接口
 
   

 

 

 

你可能感兴趣的:(enum)