日期:2014-05-19  浏览次数:20859 次

Dictionary.ContainsKey和List.BinarySearch哪个效率高
有一个静态的列表,需要频繁地判断一个字符串是否在该列表中。这样的情况用dictionary还是用list来保存这个列表比较合适。

------解决方案--------------------
1.
当然选择 Dictionary

2.
完全可以按最基本的数据结构知识来判断

3.
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查找时好像也是用二分查找实现的
=======
得补数据结构去了