2011-06-23 20 views
32

cómo convertir una HashTable a Dictionary en C#? ¿Es posible? por ejemplo, si tengo una colección de objetos en HashTable y si quiero convertirlo a un diccionario de objetos con un tipo específico, ¿cómo hacerlo?convertir HashTable a Dictionary en C#

+0

¿Conoce el tipo de los elementos 'Dictionary' en tiempo de compilación o tiempo de ejecución? –

+0

¿Se pueden convertir todos los objetos (claves y valores) del HashTable a un tipo de objetivo específico que se utilizará como parámetro genérico para el Diccionario? ¿O preferiría excluir aquellos en el HashTable que no son del tipo apropiado? – daveaglick

+0

Si es posible, debe poner el objeto en un 'Diccionario' para comenzar. La clase 'HashTable' es prácticamente obsoleta desde que se introdujo' Dictionary'. Como 'Diccionario' es el reemplazo genérico de' HashTable', su código necesitaría ajustes menores para usar un 'Diccionario' en su lugar. – Guffa

Respuesta

53
public static Dictionary<K,V> HashtableToDictionary<K,V> (Hashtable table) 
{ 
    return table 
    .Cast<DictionaryEntry>() 
    .ToDictionary (kvp => (K)kvp.Key, kvp => (V)kvp.Value); 
} 
+0

gracias por la respuesta completa de convertir al diccionario y también el lanzamiento de la clave y el valor para el tipo dado. – RKP

8
var table = new Hashtable(); 

table.Add(1, "a"); 
table.Add(2, "b"); 
table.Add(3, "c"); 


var dict = table.Cast<DictionaryEntry>().ToDictionary(d => d.Key, d => d.Value); 
+2

gracias por la solución que no requiere bucle, que es lo que estaba buscando. sin embargo, acepté la otra solución como respuesta porque también hace el casting para corregir el tipo y tiene un método de extensión definido para él. el anterior devuelve el tipo de objeto genérico tanto para la clave como para el valor, lo que no ofrece ninguna ventaja adicional sobre la tabla hash. – RKP

3

También puede crear un método de extensión para esa versión método

Dictionary<KeyType, ItemType> d = new Dictionary<KeyType, ItemType>(); 
foreach (var key in hashtable.Keys) 
{ 
d.Add((KeyType)key, (ItemType)hashtable[key]); 
} 
0
Hashtable openWith = new Hashtable(); 
    Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

    // Add some elements to the hash table. There are no 
    // duplicate keys, but some of the values are duplicates. 
    openWith.Add("txt", "notepad.exe"); 
    openWith.Add("bmp", "paint.exe"); 
    openWith.Add("dib", "paint.exe"); 
    openWith.Add("rtf", "wordpad.exe"); 

    foreach (string key in openWith.Keys) 
    { 
     dictionary.Add(key, openWith[key].ToString()); 
    } 
2

extensión de la respuesta del agente j:

using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 

public static class Extensions { 

    public static Dictionary<K,V> ToDictionary<K,V> (this Hashtable table) 
    { 
     return table 
     .Cast<DictionaryEntry>() 
     .ToDictionary (kvp => (K)kvp.Key, kvp => (V)kvp.Value); 
    } 
} 
Cuestiones relacionadas