English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C#のHashtable(ハッシュテーブル)

Hashtableは、非ジェネリックのキー値対を保存する集合で、ジェネリック Dictionary<TKey, TValue>コレクションに似ています。各キーのハッシュコードを計算して検索を最適化し、内部で異なるバケットに保存し、値にアクセスする際に指定されたキーのハッシュコードと一致させる方法で動作します。

ハッシュテーブルの特性

  • Hashtableはキー値対を保存します。

  • System.Collection命名空间に属しています。

  • IDictionaryインターフェースを実装します。

  • キーはユニークで、null であってはなりません。

  • 値は null または重複できます。

  • インデクサーに関連するキーを渡して値にアクセスできます、例えば myHashtable[key]

  • 要素は DictionaryEntry オブジェクトとして保存されます。

ハッシュテーブル(HashTable)の作成

以下の例では、ハッシュテーブルの作成と要素の追加方法を示します。

Hashtable numberNames = new Hashtable();
numberNames.Add(1, "One"); //Add()メソッドを使用してキーを追加します/値
numberNames.Add(2, "Two");
numberNames.Add(3, "Three");
//以下がランタイムエラーを引き起こします:既にキーが追加されています。-time exception: key already added.
//numberNames.Add(3, "Three"); 
foreach (DictionaryEntry de in numberNames)
    Console.WriteLine("キー: {0}, 値: {1}
//コレクションを使用-initializer文法でHashtableを作成
var cities = new Hashtable(){
	{"イギリス", "ロンドン, マンチェスター, ブライトン"},
	{"アメリカ", "シカゴ, ニューヨーク, ワシントン"},
	{"インド", "ムンバイ, ニューデリー, ポン"}
};
foreach (DictionaryEntry de in cities)
    Console.WriteLine("キー: {0}, 値: {1}

Hashtableコレクションは、以下のように辞書のすべての要素を含むことができます。

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "one");
dict.Add(2, "two");
dict.Add(3, "three");
Hashtable ht = new Hashtable(dict);

ハッシュテーブルを更新

インデクサーにキーを渡すことで、Hashtableから既存のキーの値を取得できます。Hashtableは非ジェネリックのコレクションであり、値を取得する際には強制変換が必要です。

//コレクションを使用-initializer文法でHashtableを作成
var cities = new Hashtable(){
	{"イギリス", "ロンドン, マンチェスター, ブライトン"},
	{"アメリカ", "シカゴ, ニューヨーク, ワシントン"},
	{"インド", "ムンバイ, ニューデリー, ポン"}
};
    
string citiesOfUK = (string) cities["UK"]; //文字列に変換
string citiesOfUSA = (string) cities["USA"]; //文字列に変換
Console.WriteLine(citiesOfUK);
Console.WriteLine(citiesOfUSA);
cities["UK"] = "リバプール, ブリストル"; // UKの値を更新
cities["USA"] = "ロサンゼルス, ボストン"; //USAの値を更新
if(!cities.ContainsKey("フランス")){
    cities["フランス"] = "パリ";
}

ハッシュテーブルから要素を削除する

Remove()メソッドは、Hashtable内で指定された値に一致するキー値を削除します。指定されたキーがHashtable内に存在しない場合、KeyNotfoundExceptionが発生します。したがって、削除する前にContainsKey()メソッドを使用してキーが存在するか確認します。

Clear()メソッドを使用すると、一度にすべての要素を削除できます。

var cities = new Hashtable(){
	{"イギリス", "ロンドン, マンチェスター, ブライトン"},
	{"アメリカ", "シカゴ, ニューヨーク, ワシントン"},
	{"インド", "ムンバイ, ニューデリー, ポン"}
};
cities.Remove("UK"); // UKを削除する
//UKを削除する //ランタイムエラー:KeyNotFoundExceptionが発生しました
if(cities.ContainsKey("France")){ // キーを取得する前に確認してください
    UKを削除する
}
cities.Clear(); //すべての要素を削除する

ハッシュテーブルクラス階層構造

以下の図はHashtableクラスの階層構造を示しています。

C# ハッシュテーブル