2012-03-29 20 views
10

Veo muchas preguntas/respuestas sobre cómo convertir una Hashtable a un diccionario, pero ¿cómo puedo convertir un diccionario a una Hashtable?Cómo convertir Diccionario <> a Hashtable en C#?

+1

¿Y por qué necesitarías eso? Un Hashtable es muy específico porque un valor calculado en la clave produce la ubicación del valor ... y un diccionario es simplemente una colección recta (clave, valor). ¿Por qué querrías convertir un diccionario a una tabla hash? –

+0

En el nivel más simple, soy flojo. El objeto que es de tipo 'Hashtable' se usa en muchos lugares. – jpints14

+0

Eso en sí mismo no es una razón para usarlo. Diccionarios y Hashtables son bestias diferentes que se usan bajo diferentes circunstancias. Ya sabes, una lista también se usa en muchos lugares ... ¿Por qué no usar eso? : -s –

Respuesta

23

La forma más fácil es usar constructor de Hashtable:

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

parece bastante raro que querer hacerlo, pero a la más simple:

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

(suponiendo que no haya inusuales "implementos mecanografiado comprobación de igualdad, pero no la igualdad sin tipo de verificación", etc)

+1

Ahora solo incluye esto en un método de extensión 'ToHashTable' y ¡listo! – Dismissile

+1

Incluso hay un [constructor] (http://msdn.microsoft.com/en-us/library/kdkta2sx.aspx) que hace lo mismo. – Joey

+0

Esto es lo que estaba pensando hacer. Me preguntaba si había una forma no tan obvia de hacerlo. Sin embargo, ¡gracias! – jpints14

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

Prueba esto

3

Es posible que desee considerar el uso de la sobrecarga Hashtable constructor que toma un parámetro IEqualityComparer:

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

De esta manera, su tabla hash utiliza el mismo Comparer como el diccionario. Por ejemplo, si su diccionario utilizó una clave de cadena que no distingue entre mayúsculas y minúsculas, es posible que desee que su Hashtable también distinga entre mayúsculas y minúsculas. P. ej .:

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 
Cuestiones relacionadas