2011-06-23 7 views
32

ハッシュテーブルをC#で辞書に変換する方法は?出来ますか?例えば、私がHashTableにオブジェクトのコレクションを持っていて、それを特定の型のオブジェクトの辞書に変換したいのであれば、それを行う方法は?C#でハッシュテーブルを辞書に変換する

+0

あなたはのタイプを知っていますかコンパイル時や実行時の 'Dictionary'要素は? –

+0

HashTableキャスト可能オブジェクトのすべてのオブジェクト(キーと値)は、ディクショナリの汎用パラメータとして使用される特定のターゲットタイプですか?あるいは、適切なタイプではないものをHashTableで除外しますか? – daveaglick

+0

可能であれば、オブジェクトを 'Dictionary'に入れて始めましょう。 'Dictionary 'が導入されて以来、' HashTable'クラスは実質的に廃止されています。 'Dictionary'は' HashTable'の一般的な置き換えであるため、あなたのコードでは代わりに 'Dictionary'を使用するための小さな調整が必要です。 – Guffa

答えて

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

辞書に変換し、指定された型にキーと値をキャストする完全な答えをありがとう。 – 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

私は何を探していたかのループを必要としないソリューションに感謝します。しかし、私は他の解決策を回答として受け入れました。なぜなら、タイプを修正するためのキャストを行い、拡張メソッドが定義されているからです。上記のものは、キーと値の両方に対して汎用オブジェクト型を返します。これはハッシュテーブルよりも利点がありません。 – RKP

3

また、あなたがエージェント-Jの答えのよう

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

拡張メソッドのバージョンの拡張メソッドを作成することができます。

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); 
    } 
} 
関連する問題