C#でのハッシュテーブルと辞書の操作

Microsoft .Net Frameworkは、コレクションの操作に優れたサポートを提供します。コレクションは、データの保存と取得に使用されます。アプリケーションでコレクションを使用してメモリを動的に割り当てて要素を格納し、必要に応じてキーまたはインデックスを使用してそれらを取得します。基本的に、コレクションは、コレクションの各要素を反復処理することでアクセスできるオブジェクトのセットを表します。

ハッシュ表

System.Collections名前空間の型は、データをObject型のオブジェクトとして格納します。ハッシュテーブルは、オブジェクトをキーと値のペアとして格納できるデータ構造を表します。対応するキーを使用して、Hashtableクラスのインスタンスで値を検索できます。Hashtableインスタンスに格納されているキーと値はどちらもオブジェクトタイプであることに注意してください。キーをnullにすることはできないことに注意してください。とにかくnull値を格納することができます。次のコードリストは、Hashtableインスタンスからキー/値を格納および取得する方法を示しています。

static void Main()

       {

           Hashtable hashTable = new Hashtable();

           hashTable.Add(1, "Joydip");

           hashTable.Add(2, "James");

           hashTable.Add(3, "Steve");

           Console.WriteLine("The key / value pairs are:--");

           foreach (int key in hashTable.Keys)

           {

               Console.WriteLine("Key: "+ key + " Value: "+ hashTable[key].ToString());

           }

           Console.Read();

       }

また、HashtableクラスのGetEnumerator()メソッドを利用して、コレクションを列挙し、コレクションに格納されているキーと値のペアを取得することもできます。これを説明するコードスニペットを次に示します。

IDictionaryEnumerator enumerator = hashTable.GetEnumerator();

while (enumerator.MoveNext())

{

Console.WriteLine("Key: " + enumerator.Key.ToString() + " Value: " + enumerator.Value.ToString());

}

DictionaryEntryクラスを利用して、ハッシュテーブル内のアイテムを反復処理することもできます。次のコードスニペットは、これを行う方法を示しています。

Hashtable hashTable = new Hashtable();

hashTable.Add(1, "Joydip");

hashTable.Add(2, "James");

hashTable.Add(3, "Steve");

foreach (DictionaryEntry dictionaryEntry in hashTable)

{

   Console.WriteLine("Key: " + dictionaryEntry.Key.ToString() + " Value: " + dictionaryEntry.Value.ToString());

}

ハッシュテーブル内のアイテムの検索は、他の非ジェネリックコレクションと比較して高速です-理由を理解しましょう。ハッシュキーを使用したバケット内のハッシュテーブル内のレコード(各バケットには複数のレコードを含めることができます)。ハッシュキーは、ハッシュアルゴリズムを使用して自動的に生成されます。MSDNは次のように述べています。「要素がハッシュテーブルに追加されると、要素はキーのハッシュコードに基づいてバケットに配置されます。その後のキーのルックアップでは、キーのハッシュコードを使用して、特定の1つのバケットのみを検索します。したがって、要素を見つけるために必要な主要な比較の数を大幅に減らすことができます。」

辞書

System.Collections.Generic namsepaceの重要なクラスには、List、Queue、HashSet、LinkedList、Stack、LinkedListNode、Dictionaryなどがあります。C#のDictionaryクラスは、データのキーと値を含むことができる汎用データ構造を表します。したがって、任意のタイプのデータをディクショナリインスタンスに格納できます。

ICollectionインターフェイスはIEnumerableインターフェイスを拡張しますが、IDictionaryインターフェイスとIListインターフェイスの両方がICollectionインターフェイスを拡張することに注意してください。Dictionaryクラスは、System.Collections.Generic名前空間内に含まれています。本質的に、ディクショナリにはキーと値のペアの一般的なコレクションが含まれています。DictionaryクラスのAddメソッドを利用して、Dictionaryインスタンスにオブジェクトを格納できます。ディクショナリは、ボックス化とボックス化解除のオーバーヘッドを排除するため、ハッシュテーブルよりも高速です。

次のコードスニペットは、Dictionaryインスタンス内でオブジェクトを保存および取得する方法を示しています。

Dictionary dictionary = new Dictionary();

dictionary.Add(1, "Joydip");

dictionary.Add(2, "James");

dictionary.Add(3, "Steve");

foreach (KeyValuePair kvp in dictionary)

{

Console.WriteLine(kvp.Key.ToString() + " - " + kvp.Value.ToString());

}

HashtableとDictionaryの基本的な違いは、前者は型指定されておらず、ボックス化とボックス化解除のオーバーヘッドが必要ですが、後者は型指定されたとおりではないということです。それらの間には別の違いがあります。インデクサーを使用してHashtableインスタンスから値を取得し、アイテムが存在しない場合、null値が返されます。逆に、Dictionaryインスタンスから存在しないアイテムを取得しようとすると、例外がスローされます。HashtableもDictionaryも、コレクション内のアイテムの順序を維持することを保証しないことに注意してください。

ハッシュテーブルは弱い型のデータ構造ですが、ディクショナリは強い型のデータ構造です。ハッシュテーブルと辞書のどちらを選択するかは、タイプセーフなコレクションが必要かどうかによって異なります。ほとんどの場合、辞書は良い選択です。簡単に言うと、辞書は改良されたハッシュテーブルです。私はハッシュテーブル上で辞書を頻繁に使用します。