2011-06-23 20 views
32

come convertire un HashTable in Dictionary in C#? È possibile? per esempio se ho una collezione di oggetti in HashTable e se voglio convertirlo in un dizionario di oggetti con un tipo specifico, come farlo?convertire HashTable in Dictionary in C#

+0

Non si conosce il tipo di gli elementi 'Dictionary' in fase di compilazione o in fase di esecuzione? –

+0

Tutti gli oggetti (chiavi e valori) del calcola HashTable su un tipo di target specifico che verrà utilizzato come parametro generico per il dizionario? O preferiresti piuttosto escludere quelli nell'HashTable che non sono del tipo appropriato? – daveaglick

+0

Se possibile, si dovrebbe mettere l'oggetto in un 'dizionario' per iniziare. La classe 'HashTable' è praticamente obsoleta da quando è stato introdotto' Dictionary'. Dato che 'Dictionary' è il sostituto generico di' HashTable' il tuo codice avrebbe bisogno di piccoli aggiustamenti per usare invece un 'Dictionary'. – Guffa

risposta

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

grazie per la risposta completa della conversione al dizionario e anche il casting della chiave e del valore per il tipo specificato. – 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

, grazie per la soluzione che non richiede il looping, che è quello che stavo cercando. tuttavia ho accettato l'altra soluzione come risposta perché esegue il casting per correggere il tipo e ha un metodo di estensione definito per questo. il precedente restituisce il tipo di oggetto generico sia per la chiave che per il valore che non fornisce alcun vantaggio aggiuntivo rispetto a hashtable. – RKP

3

inoltre è possibile creare un metodo di estensione per quella

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

Estensione versione modalità di risposta dell'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); 
    } 
}