2010-06-17 80 views
21

在C#中,我發現自己在99%的時間內使用了List<T>,IList<T>IEnumerable<T>。有沒有這樣的情況:在這些情況下,使用HashTable(或2.035及以上的Dictionary<T,T>)會更好?何時使用HashTable

編輯:

正如指出的那樣,想什麼有人收集做往往決定一個人應該是使用的是什麼,所以當你可以使用一個Hashtable/Dictonary<T,T>List<T>

回答

16

也許不是直接相關的有機磷農藥問題,而是有關於在使用該集合結構的有用的博客文章:SortedSets

基本上,你想用集合做什麼決定了你應該建立什麼類型的集合。

總結的詳細信息:

  • 使用IList的,如果你希望能夠枚舉和/或修改集合
  • 使用IEnumeration(通常在列表的末尾添加),如果你只是想枚舉集合(不需要添加/刪除 - 通常用作返回類型)
  • 使用IDictionary的,如果你想通過一鍵訪問元素(添加/使用鍵快速刪除元素)
  • 使用的SortedSet如果你想訪問一個收藏(最常見的用法是按順序訪問集合)

  • 總的來說,如果你想通過鍵訪問/修改項目沒有特定的順序,那麼使用字典(優先於列表,因爲通常按順序完成,優於枚舉,你不能修改枚舉,優於哈希表,這不是嚴格類型,優於排序列表時,你不需要排序鍵)

+1

爲了進一步將集合與其他集合區分開來:集合不允許其中的重複元素(並且SortedSet等不會拋出異常來告訴你這個,但.Add()將返回一個布爾值來告訴你)。因此,雖然在某些情況下您可能需要有序列表,但SortedSet可能不是理想的集合。 – 2010-06-17 12:03:34

6

是的,當你需要能夠(快速)按鍵查找項目。

當然,你也可以通過IListIEnumerable等的匹配鍵搜索,但是這將需要O(n)的時間,而不是O(1)HashtableDictionary

0

你不是真的比較相同的東西,當我使用字典時,這是因爲我想查找數據,通常我想存儲一個對象列表,我希望能夠快速查看它們使用某種類型的鑰匙。

9

當您希望快速查找基於密鑰的項目時,可以使用散列表(字典)。

如果您使用List, IList or IEnumerable通常這意味着您正在循環數據(在IEnumerable的情況下,它肯定意味着這一點),並且散列表不會爲您提供任何內容。現在,如果您在一個列表中查找值並使用它來訪問另一個列表中的數據,則會有所不同。例如:

  1. 在項目foo的列表中查找位置。
  2. foo列表中的位置對應於另一個包含Foo_Value的列表中的位置。
  3. 訪問位置以秒爲單位獲得Foo_Value。

這是一個link描述不同的數據類型。

Another link.

1

哈希表是,如果你經常做「爲收集東西」不錯的選擇,你不關心集合中的項目的順序。

散列表是索引。您可以維護一個哈希表來索引一個列表,因此您可以選擇按順序訪問它,也可以根據該鍵隨機訪問它。

0

我使用Hashtable中經常發回關鍵/值集合通過頁面方法到Javascript。

當您需要檢索給定ID的對象時,字典可以緩存事物,但不希望碰到數據庫:假設您的集合不夠大,不足以導致大量衝突和數據需求IEnumerable的檢索速度通常太慢,字典可以提供一個體面的加速。

0

有沒有確切告訴不知道收集什麼的方式,但除非你的集合中的項目都是獨一無二的,你不能用一個哈希表,一樣會有什麼作爲重點使用。所以也許你正在尋找的經驗法則是,如果你的成員都是不同的,並且你想通過密鑰拉出各個實例,那麼使用哈希表。如果你有一堆你希望以同樣的方式處理的項目(比如對整個集合進行foreach),請使用一個列表。

0

Hashtable優化查找。它計算你添加的每個鍵的散列值。然後它使用這個散列碼來快速查找元素。它是一個較舊的.NET Framework類型。它比通用字典類型慢。

+0

你有沒有參考Hashtable變慢? – 2015-04-13 21:32:27