茶楼

有天,能回复平静。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
说明:本文是本人的一些理解,可能存在缺漏不严谨之处,非常欢迎高手斧正,如有朋友看完想喷,还请您喷轻点.

  C#集合类型初探(1)

C#关于集合的接口、类,均定义在两个namespace中:System.Collections 和 System.Collections.Specialized

System.Collections命名空间包含接口和类,这些接口和类定义了各种对象(如列表、队列、位数组、哈希表和字典)的集合以及这些集合应该具备的功能。System.Collections.Specialized命名空间中定义了一些专用的集合,使用面比较狭窄,只能适用于某种特定的情况。

 

一、System.Collections中的接口:

1、 包含4个基接口:IEnumerable、IEnumerator、IComparer、IEqualityComparer 

2、 IEnumerable和IEnumerator接口:

--> IEnumerator:可理解为一个“实现型”的接口,定义了枚举器(要支持foreach方式的遍历所需要)的具体内容。

包含:MoveNext(),Reset()两个方法和一个只读属性Current(表示取得的枚举数/对象)。

--> IEnumerable:可理解为一个“声明式”的接口,用来声明派生的类是可枚举的。

只包含一个方法:GetEnumerator(),返回的是IEnumerator类型。

3、 ICollection接口:从IEnumerable派生,由此支持简单迭代的操作。是基本的集合类所继承的接口。

4、 ICollection又派生出:

-->  IDictionary接口 :添加了适合键/值(key,value)集合类的一些方法与属性。

-->  IList接口:添加了适合列表集合类的一些方法与属性。

5、 IComparer接口:包含了一个唯一的方法Compare(object x,object y),返回int型。如x>y,则返回正值;如x<y,则返回负值;相等则返回0。由于集合中存放的数据往往是object类型,进行排序比较时,程序并不知道该如何比较。所以,需要程序员在类中实现Compare方法,来确定如何比较。

6、IEqualityComparer接口:包含Equals、GetHashCode两个方法。Equals方法与Compare类似,但主要用于判断对象是否相等,返回bool型。GetHashCode方法用于s生成一个与对象的值相对应的数字(哈希代码)。

 

二、System.Collections中的类:

System.Collections命名空间中定义了12个类,除了已过时的CaseInsensitiveHashCodeProvider类外,我们将其余11个类分成3种类型:比较类、集合类、强类型集合基类。

 

1、比较类

用于比较两个对象,共有两个。都继承IComparable、ISerializable接口。

-->Comparer类:对字符串的大小写敏感。

  该类被定义成sealed(不可被继承)。构造函数为public Comparer(CultureInfo culture),该类能根据特定区域性的信息进行比较,用culture参数确定特定区域。(关于CultureInfo类型请参考相关说明)

-->CaseInsensitiveComparer类:对字符串的大小写不敏感。

在数组或者集合中,有一个排序的方法Sort(),该方法内部需对数组或集合中的数据进行比较,而这些数据很可能是object类型,所以该方法需要程序员提供相应的比较方法。而提供的方法有两种:

  A、传入Sort()方法的数组或集合对象,本身必须派生于IComparer接口(实现了该接口的比较方法)。注:在System命名空间里也有一个IComparer接口,该接口用于比较的成员方法是CompareTo

  B、给Sort()方法再传入一个实现了IComparer接口的对象,Sort()方法就会利用这个有比较功能的对象来给数组/集合进行排序。

 

2、集合类

  System.Collections中提供的集合类有:ArrayList类、SortedList类、Hashtable类、Queue类、Stack类、BitArray类。

  除了BitArray类外,这些类的项的类型都是Object类型,基于C#的多态性,任何c#中合法的类型在进入这些集合的时候都不需要进行类型转换。

2.1 ArrayList类--数组型集合--继承了IList接口

  ArrayList类在实例化的时候,对象的内部放置了一个内置的数组。同时,该类提供了一些额外的属性和方法成员,对该数组进行读取或操作。所以,ArrayList类的实质,就是对数组的一个包装。该集合于数组的一个显著区别,就是其是长度可变的,即项的数目是可变的。

ArrayList类属性表

属性名

说明

Capacity

获取或设置 ArrayList 可包含的元素数

Count

获取ArrayList中实际包含的元素数

IsFixedSize

获取一个值,该值指示ArrayList是否具有固定大小

IsReadOnly

获取一个值,该值指示ArrayList是否为只读

Item

获取或设置指定索引处的元素

  -->Capacity属性是实现ArrayList类的关键属性。创建一个ArrayList对象时,其内置数组的Length就是Capacity。接着,当ArrayList中存储的数据变化,其Count属性等于或超过Capacity时,系统会为该对象重新创建一个Capacity值更大的内置数组,然后把旧数组的数据放入新的数组。而此时ArrayList的Capacity值,就是这个新的内置数组的Length了。

ArrayList类方法表

方法名

功能说明

Add

将对象添加到ArrayList的结尾处

AddRange

将另一个集合的所有元素批量添加到ArrayList的末尾

Contains

确定某元素是否在ArrayList中

FixedSize

返回固定大小的ArrayList,其中的元素允许修改,但不允许添加或移除

GetRange

从源ArrayList中取出其中的一个子集返回

Remove

从ArrayList中移除特定对象的第一个匹配项

Insert

将元素插入ArrayList的指定索引处

InsertRange

将一个集合整体批量地插入到ArrayList的指定索引处

ReadOnly

返回一个与原ArrayList相同的ArrayList,返回的ArrayList具有只读的性质

RemoveAt

在指定索引处移除ArrayList的元素

RemoveRange

从ArrayList中移除一定范围的元素

Repeat

返回一个ArrayList,它的元素是指定值的重复拷贝

SetRange

从指定位置用另一个集合批量覆盖原ArrayList的项的值

ToArray

将ArrayList的元素复制到新数组中

TrimToSize

将容量设置为ArrayList中元素的实际数目

 

 

  

posted on 2011-05-24 20:28  乌冻  阅读(967)  评论(0编辑  收藏  举报