web-dev-qa-db-ja.com

Hashtable、Dictionary、KeyValuePairの違いは何ですか?

コードで辞書を使用していますが、同僚はハッシュテーブルを使用しています。 MSDNによると、Key Valueペアで作業しており、ハッシュテーブルと辞書の例はMSDNでも同じです。

それでは、それらは互いにどの程度異なっており、どちらが最良であるか、または異なる機会に適していますか?

25
Nikhil Agrawal

Hashtableは、型なしの連想コンテナであり、DictionaryEntryクラスを使用して、キーと値のペアを介して列挙の結果を返します。

Dictionary<K,T>は、C#2.0で導入されたHashtableの一般的な置き換えです。 KeyValuePair<K,T>汎用オブジェクトを使用して、キーと値のペアを表します。

最近Hashtableが表示されるのは、ジェネリックスが導入される前に.NET1.1で実行する必要のあるレガシーコードだけです。互換性の理由で維持されていますが、できる限りDictionary<K,T>を選択する必要があります。

25
dasblinkenlight

KeyValuePairは、Hashtable(またはDictionary)に格納されているデータの単位です。それらは互いに同等ではありません。

キーと値のペアには、1つのキーと1つの値が含まれます。ディクショナリまたはハッシュテーブルには、多くのキーの関連する値へのマッピングが含まれています。

KeyValuePairは、2つの関連する情報を単一のユニットとして保存する場合、特に一方が他方に識別方法で関連している場合(たとえば、1234 => "David Smith")に役立ちます。これらは、辞書を反復処理したときに返されるものでもあります。 .NET 4.0では、これらは実際にはディクショナリの内部でのみ使用することを目的としています。タプルクラスは汎用的な使用のために導入されました。

HashtableDictionaryの違いは、Hashtableはジェネリッククラスではないことです。キーと値はどちらもObject型です。 Dictionaryは一般的なものであり、通常、新しい開発ではHashtableを優先して使用する必要があります。

17
Chris Shain

辞書は型付きハッシュテーブルです。キーと値のデータ型がわかっている場合は、パフォーマンス上の理由から辞書を使用してください(キャストは避けてください)。

5
hp.

主な違いの1つは、Hashtableはスレッドセーフですが、Dictionaryはそうではないことです。

ドキュメント は言う:

Hashtableは、複数のリーダースレッドと単一の書き込みスレッドで使用できるスレッドセーフです。スレッドの1つだけが書き込み(更新)操作を実行する場合、マルチスレッドでの使用に対してスレッドセーフです。これにより、ライターがHashtableにシリアル化されている場合、ロックフリーの読み取りが可能になります。複数のライターをサポートするには、Hashtableオブジェクトを読み取るスレッドがない場合、Hashtableに対するすべての操作は、Synchronizedメソッドによって返されるラッパーを介して実行する必要があります。

これを Dictionaryドキュメント と比較してください:

Dictionary(Of TKey, TValue)は、コレクションが変更されていない限り、複数のリーダーを同時にサポートできます。

0
Gabe

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
}
0
Yogesh Patel