はじめに
以下のように、Dictionaryで存在しないkeyでvalueを取得しようとすると
Dictionary<string, int> dict = new Dictionary<string, int>(); int tmp = dict["key"];
KeyNotFoundException: The given key was not present in the dictionary.
と例外が発生してしまいます。
こんな事が起きないようにTryGetValueというメソッドが用意されていますが、
Dictionary<string, int> dict = new Dictionary<string, int>(); int tmp = 10; dict.TryGetValue("key", out tmp);
上記のように返り値でvalueを取得するわけでは無く、参照渡しで取得する上に、
keyが存在しない場合は、なぜかその型の規定値が設定されます。(上記の例だとtmpは0になる)
これだとかなり使い難いので、
keyが存在しない場合はデフォルト値を返すDictionaryの拡張メソッドを作りました。
DictionaryExtensions
その拡張メソッドが以下の通りです。
使い方は上記のDictionaryExtensions.csを作成し、
valueを取得する時にTryGetValueExを使用するだけです。
Dictionary<string, int> dict = new Dictionary<string, int>(); //tmpには10が入り、dictに<"key", 10>という値が設定される int tmp = dict.TryGetValueEx("key", 10);
keyが存在しなければ、第二引数で指定したデフォルト値をDictionaryに登録し、それを返す
ようにしています。
またDictionary自体がnullの場合は
Dictionary<string, int> dict; int tmp = dict.TryGetValueEx("key", 10);
拡張メソッド内で初期化しているので、エラーは出ません。