何时使用泛型集合

使用泛型集合可提供类型安全性的自动优势,而无需从基集合类型派生并实现特定于类型的成员。 当集合元素是值类型时,泛型集合类型通常的性能也优于相应的非泛型集合类型(并且优于从非泛型基集合类型派生的类型),因为使用泛型,因此无需对元素进行装箱。

对于面向 .NET Standard 1.0 或更高版本的程序,当多个线程可能同时添加或删除集合中的项时,请使用命名空间中的 System.Collections.Concurrent 泛型集合类。 此外,如果需要不可变性,请考虑命名空间中的 System.Collections.Immutable 泛型集合类。

以下泛型类型对应于现有集合类型:

其他类型

多个泛型集合类型没有对应的非泛型集合类型。 其中包括:

不可变生成器

当需要在应用中使用不可变功能时, System.Collections.Immutable 命名空间会提供可以使用的泛型集合类型。 所有不可变集合类型都提供 Builder 类,可在执行多个突变时优化性能。 Builder 类在可变状态中对操作进行批处理。 完成所有突变后,调用 ToImmutable 该方法以“冻结”所有节点并创建不可变泛型集合,例如 ImmutableList<T>

Builder可以通过调用非泛型CreateBuilder()方法来创建对象。 可以从Builder实例中调用ToImmutable()。 同样,从 Immutable* 集合中,可以调用 ToBuilder() 从泛型不可变集合创建生成器实例。 以下是各种 Builder 类型。

LINQ to 对象

使用 LINQ to Objects 功能,只要对象类型实现 System.Collections.IEnumerableSystem.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> 类允许您指定自己的相等比较器。

另请参阅