请务必仔细选择你的集合类。 使用错误的类型可以限制集合的使用。
重要
避免在命名空间中使用 System.Collections 类型。 建议使用集合的泛型和并发版本,因为它们的类型安全性和其他改进性更高。
考虑以下问题:
是否需要一个顺序列表,其中元素通常在检索其值后被丢弃?
如果是,请考虑使用 Queue 类或 Queue<T> 泛型类(如果需要先入先出(FIFO)行为。 如果需要最后进先出(LIFO)行为,请考虑使用 Stack 类或 Stack<T> 泛型类。 若要从多个线程进行安全访问,请使用并发版本和 ConcurrentQueue<T>ConcurrentStack<T>。 对于不可变性,请考虑使用不可变版本,即 ImmutableQueue<T> 和 ImmutableStack<T>。
如果没有,请考虑使用其他数据集。
是否需要按特定顺序(例如 FIFO、LIFO 或随机)访问元素?
类Queue以及Queue<T>ConcurrentQueue<T>ImmutableQueue<T>泛型类都提供 FIFO 访问权限。 有关详细信息,请参阅 “何时使用 Thread-Safe 集合”。
类Stack以及Stack<T>ConcurrentStack<T>ImmutableStack<T>泛型类都提供 LIFO 访问权限。 有关详细信息,请参阅 “何时使用 Thread-Safe 集合”。
泛 LinkedList<T> 型类允许从头到尾的顺序访问,也可以从尾部到头部进行顺序访问。
是否需要按索引访问每个元素?
ArrayList类和StringCollection类以及List<T>泛型类通过元素的从零开始的索引提供对其元素的访问权限。 对于不可变性,请考虑使用不可变泛型版本,ImmutableArray<T> 和 ImmutableList<T>。
Hashtable、SortedList、ListDictionary和StringDictionary类以及Dictionary<TKey,TValue>SortedDictionary<TKey,TValue>泛型类通过元素的键提供对其元素的访问权限。 此外,还有几种相应类型的不可变版本: ImmutableHashSet<T>、 ImmutableDictionary<TKey,TValue>、 ImmutableSortedSet<T>和 ImmutableSortedDictionary<TKey,TValue>。
类NameObjectCollectionBase和NameValueCollection,以及泛型类KeyedCollection<TKey,TItem>和SortedList<TKey,TValue>通过零基索引或元素的键提供对其元素的访问权限。
每个元素是否包含一个值、一个键和一个值的组合,还是一个键和多个值的组合?
一个值:使用基于 IList 接口或 IList<T> 泛型接口的任何集合。 对于不可变选项,请考虑泛 IImmutableList<T> 型接口。
一个键和一个值:使用任何基于 IDictionary 接口或 IDictionary<TKey,TValue> 泛型接口的集合。 对于不可变选项,请考虑 IImmutableSet<T> 或 IImmutableDictionary<TKey,TValue> 泛型接口。
带有嵌入键的值:使用 KeyedCollection<TKey,TItem> 泛型类。
一个键和多个值:使用 NameValueCollection 类。
您是否需要以不同于输入方式的顺序对元素进行排序?
该 Hashtable 类按其哈希代码对其元素进行排序。
SortedList 类以及 SortedList<TKey,TValue> 和 SortedDictionary<TKey,TValue> 泛型类按键对元素进行排序。 排序顺序基于IComparer接口的SortedList类的实现,以及基于IComparer<T>泛型接口的SortedList<TKey,TValue>和SortedDictionary<TKey,TValue>泛型类的实现。 在这两种泛型类型中,SortedDictionary<TKey,TValue> 的性能比 SortedList<TKey,TValue> 更好,而 SortedList<TKey,TValue> 的内存消耗更少。
ArrayList 提供了一种 Sort 方法,此方法采用 IComparer 实现作为参数。 其泛型对应类 List<T> 提供一个 Sort 方法,该方法采用泛型接口的实现 IComparer<T> 作为参数。
是否需要快速搜索和检索信息?
- ListDictionary 在处理小型集合时速度更快(处理10个项目或以下),相比之下,Hashtable 就会稍显逊色。 泛 Dictionary<TKey,TValue> 型类提供比 SortedDictionary<TKey,TValue> 泛型类更快的查找速度。 多线程实现为 ConcurrentDictionary<TKey,TValue>。 ConcurrentBag<T> 为无序数据提供快速的多线程插入。 有关这两种多线程类型的详细信息,请参阅 “何时使用 Thread-Safe 集合”。
是否需要仅接受字符串的集合?
StringCollection (基于 IList)和 StringDictionary (基于 IDictionary) 位于命名空间 System.Collections.Specialized 。
此外,可以通过为命名空间中的泛型类型参数指定System.Collections.Generic类来将命名空间中的任何String泛型集合类用作强类型字符串集合。 例如,可以将变量声明为 List<String> 或 Dictionary<String,String> 类型。
LINQ to Objects 与 PLINQ
LINQ to Objects 使开发人员能够使用 LINQ 查询访问内存中对象,只要对象类型实现 IEnumerable 或 IEnumerable<T>。 LINQ 查询提供用于访问数据的常见模式,通常比标准 foreach
循环更简洁且可读,并提供筛选、排序和分组功能。 有关详细信息,请参阅 LINQ to Objects (C#) 和 LINQ to Objects (Visual Basic)。
PLINQ 提供了 LINQ to Objects 的并行实现,通过更高效地使用多核计算机,可以在许多方案中提供更快的查询执行。 有关详细信息,请参阅并行 LINQ (PLINQ)。