li

ning
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

选择集合类

Posted on 2009-02-11 09:36  lining  阅读(232)  评论(0编辑  收藏  举报

 

---from MSDN---

 

一定要谨慎选择 System.Collections 类。选用错误的类型可能限制您使用集合。

考虑以下问题:

  • 您是否需要一个序列列表,其中的元素通常在检索其值后被放弃?

    • 如果需要,那么在需要先进先出 (FIFO) 行为时请考虑使用 Queue 类或 Queue<(Of <(T>)>) 泛型类。在需要后进先出 (LIFO) 行为时请考虑使用 Stack 类或 Stack<(Of <(T>)>) 泛型类。

    • 如果不需要,请考虑使用其他集合。

  • 是否需要以某种顺序访问元素,例如 FIFO、LIFO 或随机访问?

    • Queue 类和 Queue<(Of <(T>)>) 泛型类提供 FIFO 访问。

    • Stack 类和 Stack<(Of <(T>)>) 泛型类提供 LIFO 访问。

    • LinkedList<(Of <(T>)>) 泛型类允许从开头到末尾或从末尾到开头按顺序访问。

    • 其余的集合提供随机访问。

  • 是否需要通过索引访问每一元素?

    • ArrayList 和 StringCollection 类以及 List<(Of <(T>)>) 泛型类通过元素的从零开始的索引提供对元素的访问。

    • Hashtable、SortedList、ListDictionary 和 StringDictionary 类以及 Dictionary<(Of <(TKey, TValue>)>) 和 SortedDictionary<(Of <(TKey, TValue>)>) 泛型类通过元素的键提供对元素的访问。

    • NameObjectCollectionBase 和 NameValueCollection 类以及 KeyedCollection<(Of <(TKey, TItem>)>) 和 SortedList<(Of <(TKey, TValue>)>) 泛型类通过其元素的从零开始的索引或者通过其元素的键提供对元素的访问。

  • 每一元素将包含一个值、一个键和一个值的组合还是一个键和多个值的组合?

    • 一个值:使用任何基于 IList 接口或 IList<(Of <(T>)>) 泛型接口的集合。

    • 一个键和一个值:使用任何基于 IDictionary 接口或 IDictionary<(Of <(TKey, TValue>)>) 泛型接口的集合。

    • 带有嵌入的键的一个值:使用 KeyedCollection<(Of <(TKey, TItem>)>) 泛型类。

    • 一个键和多个值:使用 NameValueCollection 类。

  • 是否需要用与输入元素方式不同的方式对元素排序?

    • Hashtable 类按其元素的哈希代码对元素排序。

    • SortedList 类以及 SortedDictionary<(Of <(TKey, TValue>)>) 和 SortedList<(Of <(TKey, TValue>)>) 泛型类根据 IComparer 接口和 IComparer<(Of <(T>)>) 泛型接口的实现按键对元素排序。

    • ArrayList 提供 Sort 方法,该方法接受 IComparer 实现作为参数。其对应的泛型类(List<(Of <(T>)>) 泛型类)提供 Sort 方法,该方法接受 IComparer<(Of <(T>)>) 泛型接口的实现作为参数。

  • 是否需要信息的快速搜索和检索?

    • 对于小集合(10 项或更少),ListDictionary 比 Hashtable 快。Dictionary<(Of <(TKey, TValue>)>) 泛型类提供比 SortedDictionary<(Of <(TKey, TValue>)>) 泛型类更快的查找。

  • 是否需要只接受字符串的集合?

    • StringCollection(基于 IList)和 StringDictionary(基于 IDictionary)都位于 System.Collections.Specialized 命名空间中。

    • 此外,通过为泛型类型参数指定 String 类,可以使用 System.Collections.Generic 命名空间中的任何泛型集合类作为强类型字符串集合。