2012-03-29 111 views
10

我看到很多关于如何将散列表转换为字典的问题/答案,但是如何将字典转换为散列表?如何在C#中将Dictionary <>转换为Hashtable?

+1

为什么你需要这个?哈希表是非常具体的,因为在关键字上计算出的值会产生该值的位置......并且字典只是一个直的(键,值)集合。你为什么要将字典转换为散列表? – 2012-03-29 14:50:42

+0

在最简单的层面上,我很懒。 “Hashtable”类型的对象在很多地方使用。 – jpints14 2012-03-29 14:54:54

+0

这本身并不是使用它的理由。字典和散列表是在不同情况下使用的不同的野兽。你知道,列表也用在很多地方......那么为什么不使用它呢? :-s – 2012-03-29 14:56:51

回答

23

最简单的方法是使用Hashtable的构造函数:

 var dictionary = new Dictionary<object, object>(); 
     //... fill the dictionary 
     var hashtable = new Hashtable(dictionary); 
4

似乎相当罕见想做的事,但在简单的:

var hash = new Hashtable(); 
foreach(var pair in dictionary) { 
    hash.Add(pair.Key,pair.Value); 
} 

(假设没有不寻常“的工具类型平等检查,但不无类型平等检查”等)

+1

现在只需在'ToHashTable'扩展方法中包含这个,瞧! – Dismissile 2012-03-29 14:50:54

+1

甚至有一个[构造函数](http://msdn.microsoft.com/zh-cn/library/kdkta2sx.aspx)可以执行相同的操作。 – Joey 2012-03-29 14:55:37

+0

这就是我想要做的。想知道是否有一种不那么明显的方式来做到这一点。但是,谢谢! – jpints14 2012-03-29 14:56:54

8
Dictionary<int, string> dictionary = new Dictionary<int, string> 
    { 
     {1,"One"}, 
     {2,"Two"} 
    }; 
Hashtable hashtable = new Hashtable(dictionary); 

试试这个

3

你可能要考虑使用Hashtable构造函数重载接受一个IEqualityComparer参数:

var hashtable = new Hashtable(dictionary, (IEqualityComparer) dictionary.Comparer); 

这样,您的哈希表使用相同的Comparer作为字典。例如,如果您的字典使用不区分大小写的字符串键,则您可能也希望Hashtable也不区分大小写。例如:

var d = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); 
d.Add("a", "a"); 
d.Add("b", "b"); 

bool found; 
found = d.ContainsKey("A"); // true 

var hashtable1 = new Hashtable(d); 
var hashtable2 = new Hashtable(d, (IEqualityComparer) d.Comparer); 

found = hashtable1["A"] != null; // false - by default it's case-sensitive 

found = hashtable2["A"] != null; // true - uses same comparer as the original dictionary 
相关问题