65.9K
CodeProject 正在变化。 阅读更多。
Home

混沌中的秩序:.NET 集合

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (17投票s)

2010年10月8日

Ms-PL

5分钟阅读

viewsIcon

30204

回顾 .NET Framework 4.0 中当前可用的集合类型

本文将回顾 .NET Framework 4.0 中当前可用的集合类型。

请注意,我并不打算解释各种集合的历史。如果某个类已过时,这本身就足够说明问题了。

本文旨在作为您需要决定使用哪种集合类型时的参考。

另外,我不会给出每个函数的复杂度。您可以在 MSDN 上相关的类文档中找到此类信息。
总之,您可以自己推断出来,因为这是非常普遍的知识,例如,基于数组的列表在末尾添加元素的时间复杂度是 O(1),而在中间添加元素的时间复杂度是 O(n)。稍作思考便可明白。

在开始之前,最后一点说明:我将跳过特殊集合,主要是同步集合和并发集合。

回顾将遵循以下约定:类名、命名空间、描述和总结。

例如

类名Array
命名空间System
描述:.NET Framework 中所有数组的基类。
总结:非常基础的类型,但有时这正是您所需要的。

旧集合

常用旧集合

类名ArrayList
命名空间System.Collection
描述:对象列表,内部使用一个动态调整大小的数组。
总结:请改用 List<T>

类名Stack
命名空间System.Collection
描述:表示一个后进先出 (LIFO) 的对象集合。实现为循环数组,动态调整大小。
总结:请改用 Stack<T>

类名Queue
命名空间System.Collection
描述:表示一个先进先出 (FIFO) 的对象集合。
实现为循环数组,动态调整大小。
总结:请改用 Queue<T>

类名Hashtable
命名空间System.Collection
描述:使用哈希表表示键值对的映射。
总结:请改用 Dictionary<T>

不太常用的旧集合

类名CollectionBase
命名空间System.Collection
描述:一个基类,用于实现强类型集合。
总结:请改用 Collection<T>

类名ReadOnlyCollectionBase
命名空间System.Collection
描述:一个基类,用于实现强类型的只读集合。
总结:请改用 ReadOnlyCollection<T>

类名SortedList
命名空间System.Collection
描述:键值对列表,按键排序,可以通过键或索引访问。
总结:请改用 SortedList<TKey,TValue>

类名ListDictionary
命名空间System.Collections.Specialized
描述:类似于 Hashtable,但内部使用单向链表。仅推荐在集合中的项目少于 10 个时使用。
总结:依我看,这种优化不值得我花时间。请改用 Dictionary<T>

类名HybridDictionary
命名空间System.Collections.Specialized
描述:当集合较小时使用 ListDictionary,当集合变大时切换到 Hashtable
总结:如果它这么好,它就应该是 Hashtable 的默认实现。请改用 Dictionary<T>

类名OrderedDictionary
命名空间System.Collections.Specialized
描述:键值对列表,可以通过键或索引访问。
总结:请改用 SortedList<TKey, TValue>

类名StringCollection
命名空间System.Collections.Specialized
描述:字符串集合。
总结:请改用 List<string>

类名StringDictionary
命名空间System.Collections.Specialized
描述:一个键和值都是字符串的哈希表。
总结:请改用 Dictionary<string,string>

仍然有用

类名BitArray
命名空间System.Collection
描述:高效的位值数组,每个标志只使用 1 位。
总结:只有当您有大量标志时才使用。

类名BitVector32
命名空间System.Collections.Specialized
描述:类似于 BitArray,但性能更好,且限制为 32 位。
总结:只有当普通的 Enum 不能满足您的需求时才使用。

新集合

常用新集合

类名List<T>
命名空间System.Collections.Generic
描述:泛型 T 列表,内部使用一个动态调整大小的数组。
总结:当需要一个简单的动态集合时,您的首选。

类名LinkedList<T>
命名空间System.Collections.Generic
描述:泛型 T 列表,内部使用双向链表节点来存储数据。
总结:与 List<T> 相同,只是在某些操作中的性能不同。

类名Stack<T>
命名空间System.Collections.Generic
描述:泛型后进先出 (LIFO) 集合。
总结:当需要堆栈时,您的首选。

类名Queue<T>
命名空间System.Collections.Generic
描述:泛型先进先出 (FIFO) 集合。
总结:当需要队列时,您的首选。

类名Dictionary<TKey, TValue>
命名空间System.Collections.Generic
描述:使用泛型哈希表表示键值对的映射。
总结:如果我必须选择一个集合,我会选择这个。在各种集合中最有用的。

不太常见的新集合

类名SortedDictionary<TKey, TValue>
命名空间System.Collections.Generic
描述:表示一个按键排序的键值对集合。类似于 SortedList<TKey, TValue>,只是在某些操作中的性能有所不同。
总结:像一个 dictionary,只是排序的。只有在您需要这个确切功能时才使用。

类名SortedList<TKey, TValue>
命名空间System.Collections.Generic
描述:与 SortedDictionary<TKey, TValue> 相同,只是在某些操作中的性能有所不同。
总结SortedDictionary<TKey, TValue> 的孪生兄弟。

类名HashSet<T>
命名空间System.Collections.Generic
描述:泛型值集合,即一个没有重复项且顺序不固定的集合。
总结:这个类仍在摸索其应用场景。在它正是您需要的时使用。

类名SortedSet<T>
命名空间System.Collections.Generic
描述:泛型值集合,它保持值的顺序。
总结:我想我能找到一个使用它的场景……

类名Collection<T>
命名空间System.Collections.ObjectModel
描述:一个基类,用于自定义强类型集合。
总结:如果您想要一个可扩展的集合,例如允许您自定义添加/删除操作,则应继承自 Collection<T>。如果您只需要一个强类型集合,请使用 List<T>,它提供了更多方法但缺乏可扩展性。

类名ReadOnlyCollection<T>
命名空间System.Collections.ObjectModel
描述:一个基类,用于自定义强类型只读集合。
总结Collection<T> 的只读对应项。

类名ObservableCollection<T>
命名空间System.Collections.ObjectModel
描述:表示一个集合,当项被添加或删除时提供通知。
总结:在 WPF 中非常有用。

类名ReadOnlyObservableCollection<T>
命名空间System.Collections.ObjectModel
描述:表示一个只读的 ObservableCollection<T>
总结:当您想保护您的集合而不失去可观察性时很有用。

暂时就到这里,
Arik Poznanski

© . All rights reserved.