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