天天看點

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查找時好像也是用二分查找實作的

=======

得補資料結構去了

繼續閱讀