定义集合

集合是一组组合在一起的类似的类型化对象。

任何类型的对象都可被组合到 Object 类型的单个集合中,以利用采用该语言继承的构造。 例如,C# foreach 语句(Visual Basic 中的 for each)需要集合中的所有对象都属于单一类型。

但是,在 Object 类型的集合中,单独对各元素执行附加的处理,例如装箱和取消装箱或转换,这影响该集合的性能。 装箱和取消装箱通常在存储或检索 Object 类型集合中的值类型时发生。

泛型集合(如 List<T>)和强类型非泛型集合(如 StringCollection)可避免造成上述性能损害,前提是元素的类型是集合所需的类型(例如,从 StringCollection 存储或检索字符串)。 此外,强类型集合自动执行添加到该集合的每一元素的类型验证。 基于这些原因,强烈建议您尽可能使用泛型集合类。

除添加、移除或搜索元素的方法外,直接或间接实现 ICollection 接口或 ICollection<T> 泛型接口的所有集合还共享若干功能:

  • 枚举器。

    枚举器是循环访问其关联集合的对象。 它可被视作指向集合中任何元素的可移动的指针。 一个枚举器只能与一个集合关联,但一个集合可以具有多个枚举器。 C# foreach 语句(Visual Basic 中的 for each)使用枚举器并隐藏操作该枚举器的复杂性。

  • 同步成员(仅 System.Collections 类)。

    对于 System.Collections 命名空间中的旧版集合类型,同步在访问集合的元素时提供一定程度的线程安全性。 默认情况下集合不是线程安全的。 如果需要对集合进行可伸缩的且高效的多线程访问,请使用 System.Collections.Concurrent 命名空间中的某个类。 有关更多信息,请参见线程安全集合

    System.Collections 命名空间中只有几个类提供 Synchronize 方法,该方法能够超越集合创建线程安全包装。 但是,System.Collections 命名空间中的所有类都提供 SyncRoot 属性,可供派生类创建自己的线程安全包装。 还提供了 IsSynchronized 属性以确定集合是否是线程安全的。 ICollection<T> 泛型接口中不提供同步功能。

  • CopyTo 方法。

    使用 CopyTo 方法可将所有集合复制到数组中;但是,新数组中元素的顺序基于枚举器返回它们的顺序。 结果数组始终是具有零下限的一维数组。

注意,ICollection<T> 泛型接口包含非泛型接口未包含的成员。

以下功能在 System.Collections 命名空间中的一些类中实现:

  • 容量和计数。

    集合的容量是其可以包含的元素的数目。 集合的计数是其实际包含的元素的数目。 BitArray 是一个特例;其容量与其长度相同,而其长度与其计数相同。 某些集合隐藏容量或计数(或两者一起隐藏)。

    所有集合在达到当前容量时可自动扩充容量。 内存被重新分配,元素从旧集合复制到新集合中。 这减少了使用集合所需的代码;但是,集合的性能可能仍受到消极影响。 避免因多次重新分配导致不佳性能的最佳方法是将初始容量设置为集合的估计的大小。

  • 下限。

    集合的下限是其第一个元素的索引。 System.Collections 命名空间中的所有索引集合的下限都为零。 默认情况下,Array 的下限为零,但在使用 CreateInstance 创建数组类的实例时可以定义不同的下限。

System.Collections 类通常可以分为三种类型:

  • 常用集合。

    这些集合是数据集合的常见变体,如哈希表、队列、堆栈、字典和列表。 许多常用集合都具有非泛型版本、泛型版本和线程安全的泛型版本。

  • 位集合。

    这些集合中的元素均为位标志。 它们的行为与其他集合稍有不同。

  • 专用集合。

    这些集合都具有专门的用途,通常用于处理特定的元素类型,如 StringDictionary

选择集合类时务必要小心。 因为每一集合都有其自身的功能,因此每一集合也就具有其自身的限制。 集合的专用性越强,其限制也就越多。 有关选择集合的提示,请参见选择集合类

请参见

参考

System.Collections

System.Collections.Specialized

System.Collections.Generic

System.Collections.Concurrent

概念

集合和数据结构

选择集合类