はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】Dictionary.Addとインデクサーによる要素の追加で挙動がどう異なるか(重複するキーの場合にArgumentExceptionか上書き)

はじめに

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 し、キーに関連付けられている値を置き換えることができることを示しています。

https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2?view=net-8.0#examples

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
{
    // 追加できなかった
}

learn.microsoft.com

補足

LINQで要素追加もできます。

learn.microsoft.com