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

C# Dictionary(辞書)

Dictionary<TKey, TValue>は泛型コレクションであり、特定の順序でキー値のペアを保存します。

辞書の特性

  • Dictionary<TKey, TValue>はキー値のペアを保存します。

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

  • IDictionary<TKey, TValue>インターフェースを実装

  • キーはユニークでなければなりません。nullではありません。

  • 値はnullまたは重複することができます。

  • インデックスを使用して関連するキーを渡すことで値にアクセスできます、例えばmyDictionary[key]

  • 要素はKeyValuePair<TKey, TValue>オブジェクトとして保存されます。

辞書の作成

Dictionary<TKey, TValue>オブジェクトを渡すことで、それが保存できるキーや値のタイプを作成できます。以下の例では、辞書の作成とキー値のペアの追加方法を示します。

IDictionary<int, string> numberNames = new Dictionary<int, string>();
numberNames.Add(1,"One"); //Add()メソッドを使用してキーを追加/値
numberNames.Add(2,"Two");
numberNames.Add(3,"Three");
//以下はランタイムエラーを引き起こします:key already added.。
//numberNames.Add(3, "Three"); 
foreach(KeyValuePair<int, string> kvp in numberNames)
    Console.WriteLine("キー: {0}, 値: {1}
//コレクションを使用-初期化子構文で辞書を生成
var cities = new Dictionary<string, string>(){
	{"UK", "ロンドン, マンチェスター, ブラッドフォード"},
	{"USA", "シカゴ, ニューヨーク, ウエストバージニア"},
	{"インド", "ムンバイ, ニューデリー, プネー"}
}
foreach(var kvp in cities)
    Console.WriteLine("キー: {0}, 値: {1}

上記の例では、numberNamesはDictionary<int, string>型の辞書であり、したがってintのキーと文字列の値を保存できます。同様に、citiesはDictionary<string, string>型の辞書であり、したがって文字列のキーと文字列の値を保存できます。辞書には重複のキーやnullのキーを含むことができませんが、値には重複のキーやnullのキーを含むことができます。キーはユニークでなければなりません。そうでないとランタイムエラーが発生します。

辞書の要素にアクセス

辞書のインデックスを使用してアクセスできます。指定されたキーで関連する値を取得します。また、ElementAt()メソッドを使用して指定されたインデックスからKeyValuePairを取得することもできます。

var cities = new Dictionary<string, string>(){
	{"UK", "ロンドン, マンチェスター, ブラッドフォード"},
	{"USA", "シカゴ, ニューヨーク, ウエストバージニア"},
	{"インド", "ムンバイ, ニューデリー, プネー"}
}
Console.WriteLine(cities["UK"]); //UKのキー値を表示
Console.WriteLine(cities["USA"]);//USAのキー値を表示
//Console.WriteLine(cities["フランス"]); // 実行時例外:run-time exception: Key does not exist
//ContainsKey()を使用して未知のキーをチェック
if(cities.ContainsKey("France")){  
    Console.WriteLine(cities["フランス"]);
}
//TryGetValue()を使用して未知のキーの値を取得
string result;
if (cities.TryGetValue("フランス", out result))
{
    Console.WriteLine(result);
}
//ElementAt()を使用してインデックスでキーペアを検索
for (int i = 0; i < cities.Count; i++)
{
    Console.WriteLine("キー: {0}, 値: {1}
}

辞書の更新

インデクサーで指定されたキーを通じてキーの値を更新します。キーが辞書に存在しない場合、KeyNotFoundExceptionが投げられますので、未知のキーにアクセスする前にContainsKey()メソッドを使用してください。

var cities = new Dictionary<string, string>(){
	{"UK", "ロンドン, マンチェスター, ブラッドフォード"},
	{"USA", "シカゴ, ニューヨーク, ウエストバージニア"},
	{"インド", "ムンバイ, ニューデリー, プネー"}
}
cities["UK"] = "リバプール,ブリストル"; //UKのキーの値を更新
cities["USA"] = "ロサンゼルス,ボストン"; //USAのキーの値を更新
//cities["フランス"] = "パリ"; //ランタイムエラー:KeyNotFoundExceptionが発生しました
if(cities.ContainsKey("France")){
    cities["フランス"] = "パリ";
}

辞書から要素の削除

Remove()メソッドは辞書から現在のキーペアを削除します。Clear()メソッドは辞書からすべての要素を削除します。

var cities = new Dictionary<string, string>(){
	{"UK", "ロンドン, マンチェスター, ブラッドフォード"},
	{"USA", "シカゴ, ニューヨーク, ウエストバージニア"},
	{"インド", "ムンバイ, ニューデリー, プネー"}
}
cities.Remove("UK"); // UKを削除する 
//cities.Remove("France"); //ランタイムエラー:KeyNotFoundExceptionが発生しました
if(cities.ContainsKey("France")){ // キーを取得する前に確認してください
    cities.Remove("France");
}
cities.Clear(); //全ての要素を削除する

辞書クラスの階層構造

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

docs.microsoft.comで辞書メソッドと属性について詳しく学びます。