コードで辞書を使用していますが、同僚はハッシュテーブルを使用しています。 MSDNによると、Key Valueペアで作業しており、ハッシュテーブルと辞書の例はMSDNでも同じです。
それでは、それらは互いにどの程度異なっており、どちらが最良であるか、または異なる機会に適していますか?
Hashtable
は、型なしの連想コンテナであり、DictionaryEntry
クラスを使用して、キーと値のペアを介して列挙の結果を返します。
Dictionary<K,T>
は、C#2.0で導入されたHashtable
の一般的な置き換えです。 KeyValuePair<K,T>
汎用オブジェクトを使用して、キーと値のペアを表します。
最近Hashtable
が表示されるのは、ジェネリックスが導入される前に.NET1.1で実行する必要のあるレガシーコードだけです。互換性の理由で維持されていますが、できる限りDictionary<K,T>
を選択する必要があります。
KeyValuePair
は、Hashtable
(またはDictionary
)に格納されているデータの単位です。それらは互いに同等ではありません。
キーと値のペアには、1つのキーと1つの値が含まれます。ディクショナリまたはハッシュテーブルには、多くのキーの関連する値へのマッピングが含まれています。
KeyValuePair
は、2つの関連する情報を単一のユニットとして保存する場合、特に一方が他方に識別方法で関連している場合(たとえば、1234 => "David Smith")に役立ちます。これらは、辞書を反復処理したときに返されるものでもあります。 .NET 4.0では、これらは実際にはディクショナリの内部でのみ使用することを目的としています。タプルクラスは汎用的な使用のために導入されました。
Hashtable
とDictionary
の違いは、Hashtable
はジェネリッククラスではないことです。キーと値はどちらもObject
型です。 Dictionary
は一般的なものであり、通常、新しい開発ではHashtable
を優先して使用する必要があります。
辞書は型付きハッシュテーブルです。キーと値のデータ型がわかっている場合は、パフォーマンス上の理由から辞書を使用してください(キャストは避けてください)。
主な違いの1つは、Hashtable
はスレッドセーフですが、Dictionary
はそうではないことです。
ドキュメント は言う:
Hashtable
は、複数のリーダースレッドと単一の書き込みスレッドで使用できるスレッドセーフです。スレッドの1つだけが書き込み(更新)操作を実行する場合、マルチスレッドでの使用に対してスレッドセーフです。これにより、ライターがHashtable
にシリアル化されている場合、ロックフリーの読み取りが可能になります。複数のライターをサポートするには、Hashtableオブジェクトを読み取るスレッドがない場合、Hashtable
に対するすべての操作は、Synchronized
メソッドによって返されるラッパーを介して実行する必要があります。
これを Dictionary
ドキュメント と比較してください:
Dictionary(Of TKey, TValue)
は、コレクションが変更されていない限り、複数のリーダーを同時にサポートできます。
KeyValuePair<TKey, TValue>
は、Dictionary<TKey, TValue>
によって使用されるタイプです。ディクショナリ内のアイテムを反復処理すると、一連のKeyValuePair
オブジェクトが取得されます。
使用例を次に示します。
var dict = new Dictionary<string, int>();
dict.Add("Hello", 1);
foreach (KeyValuePair<string, int> entry in dict)
{
string s = entry.Key;
int i = entry.Value;
// More logic here
}