OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

DictionaryをJavaのHashMapライクに使用する

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;
    }
}

拡張メソッドは、どこにでも書けてしまうのが恐ろしいけど、
やっぱり便利な部分では便利ですよね。