混沌中的秩序:.NET 集合






4.85/5 (17投票s)
回顾 .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
CodeProject