使用泛型集合可提供类型安全性的自动优势,而无需从基集合类型派生并实现特定于类型的成员。 当集合元素是值类型时,泛型集合类型通常的性能也优于相应的非泛型集合类型(并且优于从非泛型基集合类型派生的类型),因为使用泛型,因此无需对元素进行装箱。
对于面向 .NET Standard 1.0 或更高版本的程序,当多个线程可能同时添加或删除集合中的项时,请使用命名空间中的 System.Collections.Concurrent 泛型集合类。 此外,如果需要不可变性,请考虑命名空间中的 System.Collections.Immutable 泛型集合类。
以下泛型类型对应于现有集合类型:
Dictionary<TKey,TValue> 和 ConcurrentDictionary<TKey,TValue> 是对应于 Hashtable 的泛型类。
Collection<T> 是对应于 CollectionBase的泛型类。 Collection<T> 可以用作基类,但与它不同 CollectionBase,它不是抽象的,这使得它更易于使用。
ReadOnlyCollection<T> 是对应于 ReadOnlyCollectionBase的泛型类。 ReadOnlyCollection<T> 不是抽象的,并且具有一个构造函数,它可以轻松地将现有 List<T> 集合公开为只读集合。
Queue<T>、ConcurrentQueue<T>、ImmutableQueue<T>、ImmutableArray<T>SortedList<TKey,TValue>和ImmutableSortedSet<T>泛型类对应于具有相同名称的相应非泛型类。
其他类型
多个泛型集合类型没有对应的非泛型集合类型。 其中包括:
LinkedList<T> 是提供 O(1) 插入和删除操作的常规用途的链表。
SortedDictionary<TKey,TValue> 是一个排序字典,其插入和检索操作的复杂度为 O(log
n
),这使得它成为 SortedList<TKey,TValue> 的一个有用的替代品。KeyedCollection<TKey,TItem> 是列表和字典之间的混合,它提供一种方法来存储包含其自己的键的对象。
BlockingCollection<T> 实现具有边界和阻塞功能的集合类。
ConcurrentBag<T> 提供快速插入和删除无序元素。
不可变生成器
当需要在应用中使用不可变功能时, System.Collections.Immutable 命名空间会提供可以使用的泛型集合类型。 所有不可变集合类型都提供 Builder
类,可在执行多个突变时优化性能。
Builder
类在可变状态中对操作进行批处理。 完成所有突变后,调用 ToImmutable
该方法以“冻结”所有节点并创建不可变泛型集合,例如 ImmutableList<T>。
Builder
可以通过调用非泛型CreateBuilder()
方法来创建对象。 可以从Builder
实例中调用ToImmutable()
。 同样,从 Immutable*
集合中,可以调用 ToBuilder()
从泛型不可变集合创建生成器实例。 以下是各种 Builder
类型。
- ImmutableArray<T>.Builder
- ImmutableDictionary<TKey,TValue>.Builder
- ImmutableHashSet<T>.Builder
- ImmutableList<T>.Builder
- ImmutableSortedDictionary<TKey,TValue>.Builder
- ImmutableSortedSet<T>.Builder
LINQ to 对象
使用 LINQ to Objects 功能,只要对象类型实现 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T> 接口,就可以使用 LINQ 查询访问内存中对象。 LINQ 查询提供了用于访问数据的常见模式;通常比标准 foreach
循环更简洁且可读;并提供筛选、排序和分组功能。 LINQ 查询还可以提高性能。 有关详细信息,请参阅 LINQ to Objects (C#)、LINQ to Objects (Visual Basic)和并行 LINQ (PLINQ)。
其他功能
某些泛型类型具有非泛型集合类型中找不到的功能。 例如, List<T> 对应于非泛型 ArrayList 类的类具有许多接受泛型委托的方法,例如 Predicate<T> 允许你指定用于搜索列表的方法的委托、 Action<T> 表示对列表的每个元素执行作的方法的委托,以及 Converter<TInput,TOutput> 允许在类型之间定义转换的委托。
类 List<T> 允许你指定自己的 IComparer<T> 泛型接口实现,以便对列表进行排序和搜索。 这些 SortedDictionary<TKey,TValue> 和 SortedList<TKey,TValue> 类也具有此功能。 此外,这些类允许在创建集合时指定比较器。 通过类似的方式,Dictionary<TKey,TValue> 和 KeyedCollection<TKey,TItem> 类允许您指定自己的相等比较器。