b / w Hashtable,Dictionary和KeyValuePair有什么区别?

时间:2012-04-16 03:18:45

标签: c# .net dictionary hashtable key-value

我在代码中使用Dictionary但我的同事使用Hashtable。 MSDN表示他们在Key Value对& amp; HDNtable和字典的例子在MSDN上是相同的。

然后他们彼此有多么不同&哪个是最好的还是适合不同的场合?

5 个答案:

答案 0 :(得分:24)

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

Dictionary<K,T>是C#2.0中引入的Hashtable的通用替代品。它使用KeyValuePair<K,T>个通用对象来表示其键值对。

这些天你应该看到Hashtable的唯一地方是在引入泛型之前必须在.NET 1.1上运行的遗留代码。由于兼容性原因,它一直存在,但您应该尽可能地选择Dictionary<K,T>

答案 1 :(得分:17)

KeyValuePair是存储在Hashtable(或Dictionary)中的数据单位。它们并不相同。

键值对包含单个键和单个值。字典或散列表包含许多键与其关联值的映射。

当您想要将两个相关信息作为单个单元存储时,

KeyValuePair非常有用,尤其是当一个信息以识别方式与另一个相关时(例如1234 =&gt;“David Smith”)。它们也是你在迭代字典时得到的东西。在.NET 4.0中,这些实际上仅用于在Dictionary中内部使用 - 引入了Tuple类用于通用目的。

HashtableDictionary之间的区别在于Hashtable不是通用类 - 它的键和值都是Object类型。 Dictionary是通用的,在任何新的开发中通常都应该用于Hashtable

答案 2 :(得分:5)

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

答案 3 :(得分:0)

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

documentation说:

  

Hashtable是线程安全的,可供多个读取器线程和单个写入线程使用。当只有一个线程执行写(更新)操作时,它对多线程使用是线程安全的,如果编写器被序列化为Hashtable,则允许无锁读取。为了支持多个编写器,Hashtable上的所有操作必须通过Synchronized方法返回的包装器完成,前提是没有线程读取Hashtable对象。

将此与Dictionary documentation

进行对比
  

只要未修改集合,Dictionary(Of TKey, TValue)可以同时支持多个阅读器。

答案 4 :(得分:0)

KeyValuePair<TKey, TValue>Dictionary<TKey, TValue>使用的类型。迭代字典中的项目时,会得到一系列KeyValuePair个对象。

以下是一些示例用法:

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
}