C#集合类型初探1(接口和比较类)
时间:2011-05-24 来源:乌冻
说明:本文是本人的一些理解,可能存在缺漏不严谨之处,非常欢迎高手斧正,如有朋友看完想喷,还请您喷轻点.
C#集合类型初探
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类--数组型集合
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中元素的实际数目 |