IDictionary<TKey, TValue> [key]
キーが辞書に存在しない場合に例外をスローする方法が時々本当に嫌いです。
もちろんありますがTryGetValue()
、それは使いやすさではなく、パフォーマンスのために最適化されているようです。
だから私は、ああ、それのための拡張メソッドを作るだけだと思った-私はそれをした:
public static class CollectionExtensions
{
public static TType GetValueOrDefault<TKeyType, TValue, TType>(this IDictionary<TKeyType, TType> dictionary, TKeyType key)
{
TType value = default(TType);
// attempt to get the value of the key from the dictionary
// if the key doesn't exist just return null
if (dictionary.TryGetValue(key, out value))
{
return value;
}
else
{
return default(TType);
}
}
}
これは、型推論が機能していないように見えることを除いて、正常に機能します。
明らかに、私は次のことができるようにしたい:
var extraDataLookup = new Dictionary<string, string>();
extraDataLookup["zipcode"] = model.Zipcode;
そして、値にアクセスできるようにします:
var zipcode = extraDataLookup.GetValueOrDefault("zipcode");
var foo = extraDataLookup.GetValueOrDefault("foo"); // should be null
Jon Skeet の記事やソースコードをSystem.Linq.Enumerable
リフレクターに含めて、型推論についていくつか調べましたが、何かが欠けているようです。
これは機能します:
extraDataLookup.GetValueOrDefault<string, string,string> ("foo")
しかし、これはそうではありません
extraDataLookup.GetValueOrDefault ("foo")
私は何をすべきか。
PS。私はジェネリック型推論の問題に対する解決策を探しているだけで、他の提案はありません。ありがとう。