Javaプログラマに、JavaのHashMapに比べてC#のDictionaryは使いにくいと言われたんです。
Mapは存在しないキーでget()したらnullを返してくれるのに、
C#のDictionaryはKeyNotFoundExceptionを返しやがる。
しかも例外処理が重いからいちいちTryGetValueしなきゃなんねぇ、と。
それ、拡張メソッドでできるよ!
というわけで、とりあえずコード。
public static class DictionaryExt { public static TValue Get<TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key) { TValue rtn; dic.TryGetValue(key, out rtn); return rtn; } }
staticなクラスにstaticなメソッドを作成して、パラメータにthisを付けるだけ。簡単。
キーが存在しない場合は、その型の初期値(objectならNull、intなら0)が返る。
要するにTryGetValueをラップしているだけなので。
↓こんなふうに使えるので、Mapと同じでしょ。
var dic = new Dictionary<int, string>(); dic.Add(1, "hoge"); var val1 = dic.Get(1); //"hoge" var val2 = dic.Get(2); //null
どうせなら、さらに初期値を指定できるようにすると便利ですね。
public static class DictionaryExt { public static TValue Get<TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key, TValue defaultValue) { TValue rtn; return dic.TryGetValue(key, out rtn) ? rtn : defaultValue; } }
拡張メソッドは、どこにでも書けてしまうのが恐ろしいけど、
やっぱり便利な部分では便利ですよね。