web-dev-qa-db-fra.com

convertir HashTable en dictionnaire en C #

comment convertir un HashTable en dictionnaire en C #? c'est possible? Par exemple, si j'ai une collection d'objets dans HashTable et si je veux le convertir en dictionnaire d'objets avec un type spécifique, comment procéder

34
RKP
public static Dictionary<K,V> HashtableToDictionary<K,V> (Hashtable table)
{
   return table
     .Cast<DictionaryEntry> ()
     .ToDictionary (kvp => (K)kvp.Key, kvp => (V)kvp.Value);
}
58
agent-j
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);
9
Kirill Polishchuk

aussi vous pouvez créer une méthode d'extension pour cette

Dictionary<KeyType, ItemType> d = new Dictionary<KeyType, ItemType>();
foreach (var key in hashtable.Keys)
{
 d.Add((KeyType)key, (ItemType)hashtable[key]);
}
3
alx

Version de la méthode d'extension de la réponse de l'agent-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);
    }
}
2
Roberto
    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());
    }
0
Vlad Bezden