集合类的使用大体追寻如下次序:优先选用现有的泛型集合类、接着才是选择制定自己特有的泛型集合类、然后选择使用现有非泛型集合类、最后选择自己定义需要的非泛型集合类。
集合类具有以下特点:
-
集合类定义为 System.Collections 或 System.Collections.Generic 命名空间的一部分。
-
大多数集合类都派生自 ICollection 、IComparer 、IEnumerable 、IList 、IDictionary 和 IDictionaryEnumerator 接口以及它们的等效泛型接口。
-
使用泛型集合类可以提供更高的类型安全性,在某些情况下还可以提供更好的性能,尤其是在存储值类型时,这些优势会体现得更明显。
下面的泛型类型对应于现有的非泛型集合类型:
-
List< (Of < ( T> ) > ) 是对应于 ArrayList 的泛型类。
-
Dictionary< (Of < ( TKey, TValue> ) > ) 是对应于 Hashtable 的泛型类。
-
Collection< (Of < ( T> ) > ) 是对应于 CollectionBase 的泛型类。Collection< (Of < ( T> ) > ) 可以用作基类,但与 CollectionBase 不同的是它不是抽象的。这样使用起来要方便得多。
-
ReadOnlyCollection< (Of < ( T> ) > ) 是对应于 ReadOnlyCollectionBase 的泛型类。ReadOnlyCollection< (Of < ( T> ) > ) 不是抽象的,它具有一个构造函数,该构造函数使其易于将现有的 List< (Of < ( T> ) > ) 公开为只读集合。
-
Queue< (Of < ( T> ) > ) 、Stack< (Of < ( T> ) > ) 和 SortedList< (Of < ( TKey, TValue> ) > ) 泛型类分别对应于与其同名的非泛型类。
有几种泛型集合类型没有对应的非泛型类型:
-
LinkedList< (Of < ( T> ) > ) 是一个通用链接列表,它提供运算复杂度为 O(1) 的插入和移除操作。
-
SortedDictionary< (Of < ( TKey, TValue> ) > ) 是一个排序的字典,其插入和检索操作的运算复杂度为 O(log n ),这使得它成为 SortedList< (Of < ( TKey, TValue> ) > ) 的十分有用的替代类型。
-
KeyedCollection< (Of < ( TKey, TItem> ) > ) 是介于列表和字典之间的混合类型,它提供了一种存储包含自己键的对象的方法。
LINQ to Objects
LINQ to Objects 功能允许使用 LINQ 查询访问内存中的对象,但条件是该对象类型要实现 IEnumerable 或 IEnumerable< (Of < ( T> ) > ) 。LINQ 查询提供了一种通用的数据访问模式;与标准 foreach 循环相比,它通常更加简洁,可读性更高;这种查询可提供筛选、排序和分组功能。LINQ 查询还可提高性能。有关更多信息,请参见 LINQ to Objects 。
其他功能
一些泛型类型具有非泛型集合类型中没有的功能。例如,List< (Of < ( T> ) > ) 类(对应于非泛型 ArrayList 类)具有许多接受泛型委托(如允许指定搜索列表的方法的 Predicate< (Of < ( T> ) > ) 委托、表示操作每个列表元素的 Action< (Of < ( T> ) > ) 委托和允许定义类型之间转换的 Converter< (Of < ( TInput, TOutput> ) > ) 委托)的方法。
List< (Of < ( T> ) > ) 类允许指定您自己的用于排序和搜索列表的 IComparer< (Of < ( T> ) > ) 泛型接口实现。SortedDictionary< (Of < ( TKey, TValue> ) > ) 和 SortedList< (Of < ( TKey, TValue> ) > ) 类也具有此功能,此外还允许在创建集合时指定比较器。类似地,Dictionary< (Of < ( TKey, TValue> ) > ) 和 KeyedCollection< (Of < ( TKey, TItem> ) > ) 类允许您指定自己的相等比较器。