web-dev-qa-db-ja.com

辞書とハッシュテーブルの違い

可能性のある複製:
C#でハッシュテーブルよりも辞書が優先される理由

辞書とハッシュテーブルの違いは何ですか?どちらを使用するかを決定する方法は?

104
blitzkriegz

単純に、Dictionary<TKey,TValue>はジェネリック型であり、次のことが可能です。

  • 静的型付け(およびコンパイル時検証)
  • ボクシングなしで使用

.NET 2.0以上の場合、preferDictionary<TKey,TValue>(およびその他の汎用コレクション)

微妙ですが重要な違いは、Hashtableは単一のライタースレッドで複数のリーダースレッドをサポートしますが、Dictionaryはスレッドセーフを提供しないことです。汎用ディクショナリでスレッドセーフが必要な場合は、独自の同期を実装するか、(。NET 4.0で)ConcurrentDictionary<TKey, TValue>を使用する必要があります。

191
Marc Gravell

ハッシュテーブルと辞書の違いを説明する例を挙げましょう。

ハッシュテーブルを実装するメソッドは次のとおりです

public void MethodHashTable()
{
    Hashtable objHashTable = new Hashtable();
    objHashTable.Add(1, 100);    // int
    objHashTable.Add(2.99, 200); // float
    objHashTable.Add('A', 300);  // char
    objHashTable.Add("4", 400);  // string

    lblDisplay1.Text = objHashTable[1].ToString();
    lblDisplay2.Text = objHashTable[2.99].ToString();
    lblDisplay3.Text = objHashTable['A'].ToString();
    lblDisplay4.Text = objHashTable["4"].ToString();


    // ----------- Not Possible for HashTable ----------
    //foreach (KeyValuePair<string, int> pair in objHashTable)
    //{
    //    lblDisplay.Text = pair.Value + " " + lblDisplay.Text;
    //}
}

以下は辞書用です

  public void MethodDictionary()
  {
    Dictionary<string, int> dictionary = new Dictionary<string, int>();
    dictionary.Add("cat", 2);
    dictionary.Add("dog", 1);
    dictionary.Add("llama", 0);
    dictionary.Add("iguana", -1);

    //dictionary.Add(1, -2); // Compilation Error

    foreach (KeyValuePair<string, int> pair in dictionary)
    {
        lblDisplay.Text = pair.Value + " " + lblDisplay.Text;
    }
  }
82
Pritom Nandy

HashTableとDictionaryにはもう1つの重要な違いがあります。インデクサーを使用してHashTableから値を取得する場合、HashTableは存在しないアイテムに対して正常にnullを返しますが、ディクショナリに存在しないインデクサーを使用してアイテムにアクセスしようとすると、ディクショナリはエラーをスローします

22
Rohit Gupta

ディクショナリは入力されているため(値型にはボクシングが不要です)、ハッシュテーブルには入力されていません(したがって、値型にはボクシングが必要です)。 Hashtableは、値がオブジェクトであることを常に認識しているため、辞書IMHOよりも値を取得する方法が優れています。 .NET 3.5を使用している場合でも、同様の動作を得るための辞書の拡張メソッドを簡単に作成できます。

キーごとに複数の値が必要な場合は、MultiValueDictionaryのソースコードをここで確認してください: multimap in .NET

12
Frans Bouma

違いを追加したい:

存在しないキーにアクセスしようとすると、辞書ではランタイムエラーが発生しますが、エラーではなくnullを返すため、ハッシュテーブルで問題は発生しません。

例えば.

       //No strict type declaration
        Hashtable hash = new Hashtable();
        hash.Add(1, "One");
        hash.Add(2, "Two");
        hash.Add(3, "Three");
        hash.Add(4, "Four");
        hash.Add(5, "Five"); 
        hash.Add(6, "Six");
        hash.Add(7, "Seven");
        hash.Add(8, "Eight");
        hash.Add(9, "Nine");
        hash.Add("Ten", 10);// No error as no strict type

        for(int i=0;i<=hash.Count;i++)//=>No error for index 0
        {
            //Can be accessed through indexers
            Console.WriteLine(hash[i]);
        }
        Console.WriteLine(hash["Ten"]);//=> No error in Has Table

ここでは、キー0とキー "ten"にエラーはありません(注意:tは小さいです)

//Strict type declaration
        Dictionary<int,string> dictionary= new Dictionary<int, string>();
        dictionary.Add(1, "One");
        dictionary.Add(2, "Two");
        dictionary.Add(3, "Three");
        dictionary.Add(4, "Four");
        dictionary.Add(5, "Five");
        dictionary.Add(6, "Six");
        dictionary.Add(7, "Seven");
        dictionary.Add(8, "Eight");
        dictionary.Add(9, "Nine");
        //dictionary.Add("Ten", 10);// error as only key, value pair of type int, string can be added

        //for i=0, key doesn't  exist error
        for (int i = 1; i <= dictionary.Count; i++)
        {
            //Can be accessed through indexers
            Console.WriteLine(dictionary[i]);
        }
        //Error : The given key was not present in the dictionary.
        //Console.WriteLine(dictionary[10]);

ここでは、キー0とキー10のエラーが両方とも辞書に存在しないため、アクセスエラーが発生します。

10
Pranav Singh

Hashtableクラスは、キーの格納を支援するために整数値(ハッシュと呼ばれる)を使用する特定の種類の辞書クラスです。 Hashtableクラスはハッシュを使用して、コレクション内の特定のキーの検索を高速化します。 .NETのすべてのオブジェクトは、Objectクラスから派生します。このクラスは、オブジェクトを一意に識別する整数を返すGetHashメソッドをサポートします。 Hashtableクラスは、一般的に非常に効率的なコレクションです。 Hashtableクラスの唯一の問題は、わずかなオーバーヘッドが必要であり、小さなコレクション(10個未満の要素)の場合、オーバーヘッドがパフォーマンスを妨げる可能性があることです。

考慮しなければならない2つの間に特別な違いがあります。

HashTable:は非ジェネリックコレクションです。このコレクションの最大のオーバーヘッドは、値のボックス化を自動的に行い、元の値を取得するためにアンボックス化を実行する必要があることです。これらはアプリケーションのパフォーマンスを低下させます。

辞書:これは、暗黙的なボックス化を行わない汎用タイプのコレクションです。そのため、ボックス化を解除する必要はなく、保存された元の値を常に取得するため、アプリケーションのパフォーマンスが向上します。

2番目の重要な違いは次のとおりです。

存在しないキーに基づいてハッシュテーブルの値にアクセスしようとした場合はnullを返しますが、辞書の場合はKeyNotFoundExceptionを返します。

6
Rashmi Pandit

ILookup Interfaceは、linqで.net 3.5で使用されます。

HashTableは、弱い型の基本クラスです。 DictionaryBase抽象クラスはstrtype型であり、HashTableを内部的に使用します。

ディクショナリに複数のエントリを追加すると、エントリが追加された順序が維持されるため、ディクショナリについて奇妙なことがわかりました。したがって、辞書にforeachを適用すると、挿入した順序と同じ順序でレコードが取得されます。

一方、Hashtableに同じレコードを追加すると、順序が維持されないため、これは通常のHashTableには当てはまりません。私の知る限り、DictionaryはHashtableに基づいています。これが正しい場合、なぜ私の辞書は順序を維持しますが、HashTableはそうではないのですか?

それらが異なる動作をする理由については、Generic Dictionaryがハッシュテーブルを実装しているが、System.Collections.Hashtableに基づいていないためです。汎用辞書の実装は、リストからキーと値のペアを割り当てることに基づいています。これらは、ランダムアクセスのためにハッシュテーブルバケットでインデックス付けされますが、列挙子を返すときは、リストを順番にたどります-エントリが再利用されない限り、挿入の順序になります。

shiv goird Birlasoft。:)

3
shiv govind