天天看点

Dictionary 与 Hashtable

Dictionary 与 Hashtable

当然选择   Dictionary ,完全可以按最基本的数据结构知识来判断

Dictionary <TKey,   TValue>   是   Hashtable   的泛型版本,

List <T>   是   ArrayList   的泛型版本,

4.

前者基于散列算法,或者内部实际上使用数组(列表)存储,

那么你可以选择了

如果需要非常快地添加、删除和查找项目,而且不关心集合中项目的顺序,那么首先应该考虑使用   System.Collections.Generic.Dictionary <TKey,   TValue> (或者您正在使用   .NET   Framework   1.x,可以考虑   Hashtable)。三个基本操作(添加、删除和包含)都可快速操作,即使集合包含上百万的项目。另一方面,利用   List <T> (或   .NET   Framework   1.x   中的   ArrayList)插入和删除项目所需的时间都可能有所不同。(List <T>   和   ArrayList   都在基础数组中存储项目,并保持顺序。添加项目可能需要移动基础数组中现有的项目以腾出空间。在末尾添加项目不需要进行任何移动,而且速度非常快)。

如果您的使用模式很少需要删除和大量添加,而重要的是保持集合的顺序,那么您仍然可以选择   List <T> 。虽然查找速度可能比较慢(因为在搜索目标项目时需要遍历基础数组),但可以保证集合会保持特定的顺序。另外,您可以选择   Queue <T>   实现先进先出   (FIFO)   顺序或   Stack <T>   实现后进先出   (LIFO)   顺序。虽然   Queue <T>   和   Stack <T>   都支持枚举集合中的所有项目,但前者只支持在末尾插入和从开头删除,而后者只支持从开头插入和删除。

如果需要在实现快速插入的同时保持顺序,那么使用新的   LinkedList <T>   集合可帮助您提高性能。与   List <T>   不同,LinkedList <T>   是作为动态分配的对象链实现。与   List <T>   相比,在集合中间插入对象只需要更新两个连接和添加新项目。从性能的角度来看,链接列表的缺点是垃圾收集器会增加其活动,因为它必须遍历整个列表以确保没有对象没有被释放。另外,由于每个节点相关的开销以及每个节点在内存中的位置等原因,大的链接列表可能会出现性能问题。虽然将项目插入到   LinkedList <T>   的实际操作比在   List <T>   中插入要快得多,但是找到要插入新值的特定位置仍需遍历列表并找到正确的位置。

如前所述,Dictionary <TKey,   TValue>   可能最适用于快速插入和查找项目。但是,较快的查找速度只是针对普通情况而言,某些数据集可能导致性能急剧下降。SortedDictionary <TKey,TValue>   是一个不同的实现,它用平衡树实现作为基础数据存储;这相对提高了查找速度并保持项目的排列顺序,但插入很有可能会慢一些(随集合中的项目数量不同而有所差异)。或者也可以用   SortedList <Tkey,TValue> ,它使用两个独立的数组分别保存键和值,并保持两者的顺序(最坏的情况是必须移动所有键和值)。

http://msdn.microsoft.com/msdnmag/issues/07/08/CLRInsideOut/default.aspx?loc=zh

5。

Dictionary.ContainsKey查找时好像也是用二分查找实现的

=======

得补数据结构去了

继续阅读