c#中可枚举类型详解

  

枚举是迭代一个集合中的数据项的过程。

  

我们经常使用的大多数集合实际上都已经实现了枚举的接口IEnumerable和IEnumerator接口,这样才能使用foreach迭代,有些是含有某种抽象了枚举细节的接口:ArrayList类型有索引,BitArray有得到方法,哈希表和字典有键和值..........其实他们都已经实现了IEnumerable和IEnumerator接口。所以一切的集合和数组都可以用IEnumerable或者IEnumerable接口来定义。

        IEnumerable lists1=new int [] {3、4、5};   foreach (var lists1 val)   {   Console.WriteLine (val);   }   IEnumerablelists2=new int [] {1,2,3};   foreach (var lists2 val)   {   Console.WriteLine (val);   }   之前      

下面讲解一下自己来定义可枚举类型(简单说就是自己定义的,可以进行foreach迭代的集合):

  

因为枚举非常有好处,可以消除很多的错误,所以实现某种标准是有好处的。这种标准就是IEnumerable和IEnumerator接口,必须实现了它才能够使用foreach迭代,才能真正算是一个自己定义的,功能健全的集合。

  

我们自己建立的可枚举类型必须实现IEnumerable和IEnumerator接口(其实两者都有一个泛型实现)。

  

IEnumerable接口含有一个方法,该方法返回一个枚举器对象,枚举器对象实现了IEnumerator接口(实际上可以认为继承和实现了IEnumerator的接口的类的对象就是枚举器对象),可以用它来进行迭代。

  

下面是两个接口的定义(系统早已经定义好):

        公共接口IEnumerable   {   IEnumerator GetEnumerator ();   }   之前      

该接口只有一个GetEnumerator的方法,返回一个枚举器,用于枚举集合中的元素只

        公共接口IEnumerator   {   对象当前{得到;},//当前属性返回集合的当前元素   bool MoveNext ();//将枚举移动到下一位   空白重置();//使枚举回到开的头   }   之前      

凡是继承和实现了上面这个接口的类对象就是枚举器,可以利用上面的三个方法进行枚举,非常安全。不过需要自己在继承了接口的代码中去写实现过程。

  

一般的情况是:枚举器是枚举模式的一部分,通常被实现为枚举类型(继承IEnumerable)的一个嵌套类(继承IEnumerator)。嵌套类的好处就是可以访问外部类的私有成员,不破坏封装的原则。

  

下面我们自己来定义一个枚举类型,代码如下:

        公开课SimpleCollection: IEnumerable   {//定义一个数组的字段   私有对象[]数组;//定义一个构造函数   公共SimpleCollection (object[]项目)   {   数组=物品;   }//实现IEnumerable接口的GetNumerator方法该方法返回一个继承IEnumerator接口的类的实例   公共IEnumerator GetEnumerator ()   {   返回新枚举器(数组);   }//定义一个嵌套类来继承IEnumerator的接口   公开课枚举器:IEnumerator   {//定义一个标记字段   私人int国旗;//定义一个数组的字段   私有对象[]元素=零;//定义一个构造函数   公共枚举器(object[]项目)   {   元素=物品;   标志=1;//将标记位初始化//也可以采用下面的方法//元素=新对象(items.Length);//数组。复制(物品、元素items.Length);//此静态方法用于将一个数组中的元素复制到另外一个数组   }//实现IEnumerator接口的当前属性;此属性返回集合的当前元素,是只读的   公共对象当前   {   得到   {   如果(国旗比;元素。长度- 1)把新InvalidOperationException(“枚举已经结束”);   else if(旗& lt;0)把新InvalidOperationException(“枚举尚未开始”);   其他返回元素(国旗);   }   }//实现IEnumerator接口的MoveNext方法将枚举移动到下一位   公共bool MoveNext ()   {   + +的旗帜;   如果(国旗比;(元素。长度- 1))返回false;   其他还真;   }//实现IEnumerator接口的重置方法使枚举回到开的头   公共空间重置()   {   标志=1;   }   }      之前      

下面来延时如何使用枚举类型:

     //下面来看枚举类型的使用   SimpleCollection收集=new SimpleCollection(新对象[]{1,2,3,4,5});//使用方法//接口变量名=继承了该接口的类的实例   IEnumerator enumrator=collection.GetEnumerator ();      而(enumrator.MoveNext ())   {      Console.WriteLine (enumrator.Current);   }   Console.ReadKey ();      

c#中可枚举类型详解