Dictionary<T> の使い方についてまとめています。C++を使用していた方にとっては、STLのmapやMFCのCMapにあたるものだといえば、分かりやすいでしょう。
ハッシュテーブルや連想配列などとも呼ばれていますが、要はキー(key)と値(value)のペアを保持しているコレクションです。
ここではDictionary<T> の使い方を順に説明していきます。
まずは、Dictionary<T>の初期化します。宣言時に初期値を設定することもできますが、これはコレクション初期化子を利用しています。
// Dictionaryの初期化 Dictionary<string, string> map = new Dictionary<string, string>() { { "apple", "リンゴ" }, { "banana", "バナナ" }, { "chocolate", "チョコレート" }, };
次に値の追加と削除についてですが、書き方は2通りあり、Addメソッドを使用した場合はキーが重複した際に例外が発生し、[]を使用した場合は重複した際に値が上書きされます。
// Addで追加するとキーが重複した場合に例外が発生 map.Add("dog", "犬"); // []で追加するとキーが重複した場合に値が上書きされる map["pig"] = "豚"; // 削除 map.Remove("apple");
値を取り出す場合も、2通りの方法がありますが、TryGetValueメソッドよりも、ContainsKeyメソッドを使用して存在するかのチェックを行ったあと[]を使用して値を取得する方が一般的です。
// TryGetValueを使用して値の取得する string value; bool b = map.TryGetValue("banana", out value); // []で値を取得する if (map.ContainsKey("banana")) { value = map["banana"]; }
foreachでキーや値、その両方を列挙することも可能です。
// キーを列挙 foreach (var k in map.Keys) { Console.WriteLine(k); } // 値を列挙 foreach (var v in map.Values) { Console.WriteLine(v); } // キーと値のペアを列挙 foreach (var p in map) { Console.WriteLine(string.Format("{0}:{1}", p.Key, p.Value)); }
Dictionary<T>はスレッドセーフでは無いため、マルチスレッドで動作する場合はlock構文などを使用して適切に処理する必要があります。