集合和数据结构Collections and Data Structures

有两种主要的集合类型:泛型集合和非泛型集合。泛型集合被添加在 .NET Framework 2.0 中,并提供编译时类型安全的集合。因此,泛型集合通常能提供更好的性能。构造泛型集合时,它们接受类型形参;并在向该集合添加项或从该集合删除项时无需在 Object 类型间来回转换。此外,Windows 应用商店 应用程序支持大多数泛型集合。非泛型集合将项存储为 ,需要强制转换,并且大多数不支持 Windows 应用商店 应用程序开发。但是,你可能会看到在较旧的代码中有非泛型集合。

.NET Framework 4 开始,System.Collections.Concurrent 命名空间中的集合可提供高效的线程安全操作,以便从多个线程访问集合项。System.Collections.Immutable 命名空间()中的不可变集合类本质上就是线程安全的,因为是在原始集合的副本上执行操作,且不能修改原始集合。

所有集合都提供用于在集合中添加、删除或查找项的方法。此外,所有直接或间接实现 接口或 ICollection<T> 接口的集合均共享这些功能:

  • 可将集合内容复制到数组

可使用 CopyTo 方法将所有集合复制到数组中;但新数组中的元素顺序是以枚举器返回元素的顺序为依据。得到的数组始终是一维的,下限为零。

此外,许多集合类包含下列功能:

  • 容量和计数属性

集合的容量是它可包含的元素数。集合的计数是它实际所含的元素数。某些集合隐藏容量、计数或将这两者都隐藏。

达到当前容量时,大多数集合会自动扩展容量。重新分配内存并将元素从旧集合复制到新集合。这减少了要求使用集合的代码;但集合的性能可能会受到不利影响。例如,对 来说,如果 Count 比 少,那么添加项就是一项 O(1) 操作。如需增加容量以容纳新元素,则添加项成为 O(n) 操作,其中 n 是 Count。避免因多次重新分配而导致的性能较差的最佳方式是:将初始容量设置为集合的估计大小。

是一种特殊情况;它的容量与其长度相同,而其长度与其计数相同。

命名空间中的非泛型集合类型通过同步提供一些线程安全性;通常通过 SyncRoot 和 成员公开。这些集合不是默认为线程安全的。如需对集合进行可扩展、高效的多线程访问,请使用 System.Collections.Concurrent 命名空间中的一个类或考虑使用不可变集合。有关详细信息,请参阅。

一般情况下,应使用泛型集合。下表介绍了一些常用的集合方案和可用于这些方案的集合类。如果你是使用泛型集合的新手,此表将帮助你选择最适合你的任务的泛型集合。

Title说明
选择集合类描述不同的集合并帮助你为你的方案选择一个集合。
描述诸如 System.Array、 和 System.Collections.Generic.Dictionary<TKey,TValue> 等常用泛型和非泛型集合类型。
讨论泛型集合类型的使用。
集合内的比较和排序讨论在集合中使用等同性比较和排序比较。
描述已排序集合的性能和特征
哈希表和字典集合类型描述泛型和非泛型基于哈希的字典类型的功能。
介绍支持从多个线程进行安全有效的并发访问的集合类型,例如 System.Collections.Concurrent.BlockingCollection<T> 和 。
System.Collections.Immutable介绍不可变集合并提供各集合类型的链接。