類別 System.Collections.Hashtable 和 System.Collections.Generic.Dictionary<TKey,TValue> 和 System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> 泛型類別會實作 System.Collections.IDictionary 介面。 泛 Dictionary<TKey,TValue> 型類別也會實作 IDictionary<TKey,TValue> 泛型介面。 因此,這些集合中的每個元素都是索引鍵和值組。
Hashtable物件是由包含集合元素的貯體所組成。 桶子是 Hashtable 中元素的虛擬子群組,這讓搜尋和擷取比大多數集合更簡單和快速。 每個貯體都會與哈希程式代碼相關聯,該哈希程式代碼是使用哈希函式產生的,而且是以 元素的索引鍵為基礎。
泛型 HashSet<T> 類別是包含唯一元素的未排序集合。
哈希函式是一種演算法,會根據索引鍵傳回數值哈希碼。 索引鍵是所儲存物件之某些屬性的值。 哈希函式必須一律傳回相同索引鍵的相同哈希碼。 哈希函式可以針對兩個不同的索引鍵產生相同的哈希程式代碼,但哈希函式會針對每個唯一索引鍵產生唯一的哈希碼,在從哈希表擷取元素時,會產生更好的效能。
每個做為 `Hashtable` 元素的對象都必須能夠使用 `GetHashCode` 方法的實作,為其本身生成哈希碼。 不過,您也可以透過使用一個接受Hashtable實作為參數的Hashtable建構函式,為IHashCodeProvider中的所有元素指定哈希函式。
當一個物件加入至 Hashtable 時,它會儲存在與物件哈希碼相符之哈希碼相關聯的桶中。 在搜尋 Hashtable 中的值時,會為該值產生哈希碼,並搜尋與該哈希碼相關聯的桶。
例如,字串的哈希函式可能會採用字串中每個字元的 ASCII 代碼,並將它們加在一起以產生哈希碼。 字串 「picnic」 會有一個哈希碼,與字串串 「basket」 的哈希碼不同;因此,字串“野餐”和“購物籃”會位於不同的貯體中。 相反地,“stressed”和“desserts”會有相同的哈希碼,並且會位於相同的桶位中。
Dictionary<TKey,TValue>和 ConcurrentDictionary<TKey,TValue> 類別的功能與 Hashtable 類別相同。 特定型別的Dictionary<TKey,TValue>比Object用於數值類型時提供更好的效能,除了Hashtable之外。 這是因為 Hashtable 的元素屬於類型 Object;因此,當您儲存或擷取值類型時,通常會發生裝箱和拆箱。 ConcurrentDictionary<TKey,TValue>當多個線程可能同時存取集合時,應該使用 類別。