はじめに
Dictionary
に要素を加える際に、Dictionary.Add
とインデクサーによる要素追加で少し挙動が異なります。
Dictionary<string, int> dictionary = new Dictionary<string, int>(); // Dictionary<TKey,TValue>.Add(TKey, TValue) // 既存のキーを指定した場合にはエラー(System.ArgumentException)が出力される dictionary.Add("Sato", 1); // Dictionary<TKey,TValue>.Item[TKey] // 既存のキーを指定した場合には上書きされる dictionary["Tanaka"] = 2;
その挙動の違いについて説明したいと思います。
概要
Dictionary.Add
の場合は重複したキーを引数に渡すとArgumentException
を投げ、インデクサーを利用した場合は要素が上書きされます。
次のコード例では、文字列キーを Dictionary
含む空の文字列を作成し、 メソッドを Add 使用していくつかの要素を追加します。 この例では、重複するキーを Add 追加しようとしたときに メソッドが を ArgumentException スローすることを示します。 この例では、 Item[] プロパティ (C# のインデクサー) を使用して値を取得し、要求されたキーが存在しない場合に がスローされることを示 KeyNotFoundException し、キーに関連付けられている値を置き換えることができることを示しています。
Dictionary<string, int> dictionary = new Dictionary<string, int>(); // ----------------------------------------- // Dictionary<TKey,TValue>.Add(TKey, TValue) // ----------------------------------------- dictionary.Add("Sato", 1); // System.ArgumentException: An item with the same key has already been added. Key: Sato dictionary.Add("Sato", 2); // ----------------------------------------- // Dictionary<TKey,TValue>.Item[TKey] // ----------------------------------------- // 既存のキーを指定した場合には上書きされる dictionary["Tanaka"] = 1; dictionary["Tanaka"] = 2; // 2 Console.WriteLine(dictionary["Tanaka"]);
TryAdd
Dictionary
にはTryAdd
メソッドも存在します。
Dictionary<string, int> dictionary = new Dictionary<string, int>(); // ----------------------------------------- // Dictionary<TKey,TValue>.TryAdd(TKey, TValue) // ----------------------------------------- if (dictionary.TryAdd("Sato", 3)) { // 正常に追加された } else { // 追加できなかった }