在C#中,我發現自己在99%的時間內使用了List<T>
,IList<T>
或IEnumerable<T>
。有沒有這樣的情況:在這些情況下,使用HashTable
(或2.035及以上的Dictionary<T,T>
)會更好?何時使用HashTable
編輯:
正如指出的那樣,想什麼有人收集做往往決定一個人應該是使用的是什麼,所以當你可以使用一個Hashtable
/Dictonary<T,T>
在List<T>
?
在C#中,我發現自己在99%的時間內使用了List<T>
,IList<T>
或IEnumerable<T>
。有沒有這樣的情況:在這些情況下,使用HashTable
(或2.035及以上的Dictionary<T,T>
)會更好?何時使用HashTable
編輯:
正如指出的那樣,想什麼有人收集做往往決定一個人應該是使用的是什麼,所以當你可以使用一個Hashtable
/Dictonary<T,T>
在List<T>
?
也許不是直接相關的有機磷農藥問題,而是有關於在使用該集合結構的有用的博客文章:SortedSets
基本上,你想用集合做什麼決定了你應該建立什麼類型的集合。
總結的詳細信息:
使用的SortedSet如果你想訪問一個收藏(最常見的用法是按順序訪問集合)
總的來說,如果你想通過鍵訪問/修改項目沒有特定的順序,那麼使用字典(優先於列表,因爲通常按順序完成,優於枚舉,你不能修改枚舉,優於哈希表,這不是嚴格類型,優於排序列表時,你不需要排序鍵)
是的,當你需要能夠(快速)按鍵查找項目。
當然,你也可以通過IList
或IEnumerable
等的匹配鍵搜索,但是這將需要O(n)的時間,而不是O(1)Hashtable
或Dictionary
。
你不是真的比較相同的東西,當我使用字典時,這是因爲我想查找數據,通常我想存儲一個對象列表,我希望能夠快速查看它們使用某種類型的鑰匙。
當您希望快速查找基於密鑰的項目時,可以使用散列表(字典)。
如果您使用List, IList or IEnumerable
通常這意味着您正在循環數據(在IEnumerable的情況下,它肯定意味着這一點),並且散列表不會爲您提供任何內容。現在,如果您在一個列表中查找值並使用它來訪問另一個列表中的數據,則會有所不同。例如:
這是一個link描述不同的數據類型。
哈希表是,如果你經常做「爲收集東西」不錯的選擇,你不關心集合中的項目的順序。
散列表是索引。您可以維護一個哈希表來索引一個列表,因此您可以選擇按順序訪問它,也可以根據該鍵隨機訪問它。
我使用Hashtable中經常發回關鍵/值集合通過頁面方法到Javascript。
當您需要檢索給定ID的對象時,字典可以緩存事物,但不希望碰到數據庫:假設您的集合不夠大,不足以導致大量衝突和數據需求IEnumerable的檢索速度通常太慢,字典可以提供一個體面的加速。
有沒有確切告訴不知道收集什麼爲的方式,但除非你的集合中的項目都是獨一無二的,你不能用一個哈希表,一樣會有什麼作爲重點使用。所以也許你正在尋找的經驗法則是,如果你的成員都是不同的,並且你想通過密鑰拉出各個實例,那麼使用哈希表。如果你有一堆你希望以同樣的方式處理的項目(比如對整個集合進行foreach),請使用一個列表。
Hashtable優化查找。它計算你添加的每個鍵的散列值。然後它使用這個散列碼來快速查找元素。它是一個較舊的.NET Framework類型。它比通用字典類型慢。
你有沒有參考Hashtable變慢? – 2015-04-13 21:32:27
爲了進一步將集合與其他集合區分開來:集合不允許其中的重複元素(並且SortedSet等不會拋出異常來告訴你這個,但.Add()將返回一個布爾值來告訴你)。因此,雖然在某些情況下您可能需要有序列表,但SortedSet可能不是理想的集合。 – 2010-06-17 12:03:34