代码改变世界

.Net 集合类型介绍

2005-09-15 12:03  Jeffrey Lee  阅读(504)  评论(0编辑  收藏  举报

一般集合

1)Array
Array中的秩是Array中的维数. 一个Array可以有一个或多个秩.
Array具有固定的容量. 如果有可变容量,则用Array.CreateInstance, 其可以不从零开始存储.

2)ArrayList
ArrayList是数组的复杂版本. Array数组是固定的, 而ArrayList类是根据需要自动扩展的. 如果更改了Array.Capacity属性的值, 则自动进行内存重新分配和元素复制.
ArrayList提供添加/或移除某一范围元素的方法. 在Array中, 只能一次获取或设置一个元素的值.
使用 Synchronized方法可以很容易地创建ArrayList的同步版本. 而Array将一直保持它, 直到用户实现同步为止.
ArrayList提供将只读和固定大小包装返回到集合的方法, 而Array不提供.

Array,ArrayList不同之处:
Array提供ArrayList所不具有的某些灵活性.
Array可以设置下限, 但ArrayList的下限始终为零.
Array可以具有多个维度, 而ArrayList始终是唯一的.
Array是特定类型(不是Object), 比ArrayList性能好. ArrayList在存储和检索时经常发生拆箱和装箱操作现象.

3)Hashtable
Hashtable类基于IDictionary接口, 因此该集合中的每一元素是键和值对.
Object.GetHashCode方法为其自身生成哈希代码. 还可以通过使用Hashtable构造函数, 为所有元素指定一个哈希函数.

4)SortedList
SortedList类类似于Hashtable和ArrayList间的混合.
SortedList的每一元素都是键对值, 提供只返回键列表或只返回值列表的方法.
如果想要一个保留键和值的集合, 并且还需要索引的灵活性, 则使用SortList.

5)Queue
如果需要以信息在集合中存储的相同顺序来访问这些信息, 请使用Queue.
Enqueue将一个元素添加到Queue的队尾. Dequeue从Queue处移除最旧的元素. Peek从Queue的开始处返回最旧的元素,但不将从Queue中移除. 

6)Stack
如果需要以信息在集合中存储的相反顺序来访问这些信息,请使用Stack.
Push在Stack的顶部插入一个元素. Pop在Stack的顶部移除一个元素. Peek返回处于Stack顶部的元素, 但不将其从栈顶上移除. 

位集合

1)BitArray
BitArray是一个集合类, 位于 System.Collections中. 容量与计数相同. 通过增加Length属性来将元素添加到BitArray中. 通过降低Length属性将元素删除.
独特方法, 如 And/Or/Xor/Not/SetAll.

2)BitVector32
位于 System.Collections.Specialized中. 速度快, 精确存储32位, 并且同时存储标志位和小整数. 

专用集合

1)NameValueCollection
基于NameObjectCollectionBase, 但NameValueCollection可以接受每个键多个值, 而 NameObjectCollectionBase接受每个键, 但只有一个值. 

 

Q:如何选择用哪种集合

1)Queue或Stack:
按一定的顺序访问这些元素(先进先出,后进先出),如果随机,用其它集合. 

2)是否通过索引访问每一个元素:
(ArrayList) (StringCollection) 提供通过元素的从零开始的*索引*对其元素进行访问. 
(Hashtable) (SortedList) (ListDictionary) (StringDictionary) 提供通过元素的*键*对其元素进行访问.
(NameObjectCollectionBase) 和 (NameValueCollection) 提供或者通过元素的从零开始的*索引*或者通过元素的*键*对其元素进行访问.

3)每一元素将包含一个值/一个值和一个键的组合还是一个键和多个值的组合:
一个值: 使用基于 IList 的任何集合.
一个键和一个值: 使用基于 IDictionary 的任何集合.
一个键和多个值: 使用 System.Collections.Specialized 命名空间中的 NameValueCollection 类.

4)是否需要对元素排序:
Hashtable 通过键的哈希代码对元素进行排序.
SortedList 基于 IComparer 实现,通过键对元素进行排序.
ArrayList 提供 Sort方法该方法将 IComparer 实现作为一个参数采用

5)是否需要信息的快速搜索和检索:
对于小集合(十项或更少), ListDictionary 快于 Hashtable. 

6)是否需要只接受字符串的集合:
StringCollection (基于 IList) 和 StringDictionary (基于IDictionary) 位于 System.Collections.Specialized 命名空间中.