关于c#:b / w Hashtable,Dictionary和KeyValuePair有什么区别?

What are the differences b/w Hashtable, Dictionary and KeyValuePair?

我在代码中使用字典,但我的同事使用哈希表。msdn说他们致力于密钥-值对。hashtable和dictionary的示例在msdn上是相同的。

那么,他们之间有多大的不同?哪一个是最好的,还是适合不同的场合?


Hashtable是一个非类型化的关联容器,它使用DictionaryEntry类通过其键值对返回枚举结果。

Dictionary是c 2.0中引入的Hashtable的通用替代品。它使用KeyValuePair通用对象来表示其键值对。

现在,您唯一应该看到Hashtable的地方是在引入泛型之前必须在.NET 1.1上运行的遗留代码。由于兼容性的原因,它被保留了下来,但是您应该尽可能地选择Dictionary


KeyValuePair是存储在HashtableDictionary中的数据单元。它们不等价。

键值对包含一个键和一个值。字典或哈希表包含许多键到其关联值的映射。

当您希望将两个相关信息作为一个单元存储时,KeyValuePair非常有用,尤其是当一个与另一个以标识方式相关时(例如1234=>"David Smith")。当你迭代字典时,它们也是你能得到的。在.NET 4.0中,这些实际上只用于字典内部——tuple类是为通用目的而引入的。

HashtableDictionary的区别在于Hashtable不是一个通用类——它的键和值都是Object类型。Dictionary是通用的,在任何新的开发中,一般都应该有利于Hashtable的使用。


字典是一个类型化的哈希表。如果知道键和值的数据类型,出于性能原因使用字典(避免强制转换)。


KeyValuePairDictionary使用的一种类型。当您迭代字典中的项目时,会得到一系列KeyValuePair对象。

以下是一些示例用法:

1
2
3
4
5
6
7
8
9
10
11
var dict = new Dictionary<string, int>();

dict.Add("Hello", 1);

foreach (KeyValuePair<string, int> entry in dict)
{
    string s = entry.Key;
    int i = entry.Value;

    // More logic here
}

一个主要区别是Hashtable是线程安全的,而Dictionary不是。

文件上说:

Hashtable is thread safe for use by multiple reader threads and a single writing thread. It is thread safe for multi-thread use when only one of the threads perform write (update) operations, which allows for lock-free reads provided that the writers are serialized to the Hashtable. To support multiple writers all operations on the Hashtable must be done through the wrapper returned by the Synchronized method, provided that there are no threads reading the Hashtable object.

Dictionary文件相比:

A Dictionary(Of TKey, TValue) can support multiple readers concurrently, as long as the collection is not modified.