第5章介绍了数组和Array类执行的接口。数组的大小是固定的。如果元素个数是动态的,就应使用集合类。
List<T>和ArrayList是与数组相当的集合类。还有其他类型的集合:队列、栈、链表和字典。
本章介绍如何使用对象组。主要内容如下:
集合接口和类型
列表
队列
栈
链表
有序表
字典
带多个键的字典
位数组
性能
集合类可以组合为集合,存储Object类型的元素和泛型集合类。在.NET 2.0之前,不存在泛型。现在泛型集合类通常是集合的首选类型。泛型集合类是类型安全的,如果使用值类型,是不需要装箱操作的。如果要在集合中添加不同类型的对象,且这些对象不是相互派生的,例如在集合中添加int和string对象,就只需基于对象的集合类。另一组集合类是专用于特定类型的集合,例如StringCollection类专用于string类型。
提示:
泛型的内容可参见第9章。
对象类型的集合位于System.Collections命名空间;泛型集合类位于System.Collections. Generic命名空间;专用于特定类型的集合类位于System.Collections.Specialized命名空间。
当然,组合集合类还有其他方式。集合可以根据集合类执行的接口组合为列表、集合和字典。接口及其功能如表10-1所示。.NET 2.0为集合类添加了新的泛型接口,例如IEnumerable<T>和IList<T>。这些接口的非泛型版本将一个对象定义为方法的参数,而其泛型版本使用泛型类型T。
提示:
接口IEnumerable、ICollection和IList的内容详见第5章。
对集合非常重要的接口及其方法和属性如表10-1所示。
表10-1
|
接 口 |
方法和属性 |
说 明 |
|
IEnumerable, IEnumerable<T> |
GetEnumerator() |
如果将foreach语句用于集合,就需要接口IEnumerable。这个接口定义了方法GetEnumerator(),它返回一个实现了IEnumerator的枚举。泛型接口IEnumerable<T>继承了非泛型接口IEnumerable,定义了一个返回Enumerable<T>的GetEnumerator方法。因为这两个接口具有继承关系,所以对于每个需要IEnumerable类型参数的方法,都可以传送Enumerable<T>对象 |
|
ICollection |
Count, IsSynchronized, SyncRoot, CopyTo() |
接口ICollection由集合类实现。使用这个接口的方法可以在集合中添加和删除元素 |
|
ICollection<T> |
Count,IsReadOnly, Add(),Clear(), Contains(),CopyTo() Remove() |
接口ICollection<T>扩展了接口IEnumerable的功能 |
|
IList |
IsFixedSize, IsReadOnly, Item,Add,Clear, Contains,IndexOf, Insert,Remove, RemoveAt |
接口IList派生于接口ICollection。IList允许使用索引器访问集合,还可以在集合的任意位置插入或删除元素 |
|
IList<T> |
Item,IndexOf Insert,Remove |
与接口ICollection<T>类似,接口IList<T>也继承了接口ICollection。 第5章提到,Array类实现了这个接口,但添加或删除元素的方法会抛出NotSupportedException异常。在大小固定的只读集合(如Array类)中,这个接口定义的一些方法会抛出NotSupportedExceptiuon异常 |
(续表)
|
接口 |
方法和属性 |
说明 |
|
IDictionary |
IsFixedSize, IsReadOnly,Item, Keys,Values,Add(),Clear(),Contains(), GetEnumerator(), Remove() |
接口IDictionary或IDictionary<TKey,TValue>由其元素包含键和值的集合实现 |
|
IDictionary<TKey,TValue> |
Item,Keys,Values,Add(), ContainsKey (), Remove(), TyrGetValue() |
|
|
IComparer<T> |
Compare() |
接口IComparer<T>由比较器实现,通过Compare()方法给集合中的元素排序 |
|
IEqualityComparer<T> |
Equals(), GetHashCode() |
接口IEqualityComparer<T>由一个比较器实现,该比较器可用于字典中的键。使用这个接口,可以对对象进行相等比较。方法GetHashCode()应为每个对象返回一个唯一值。如果对象相等,Equals()方法就返回true,否则返回false |