私は多くのことで自分自身を見つけるマイナーな煩わしさがあります-Dictionary<TKey, TValue>
そこにあるかもしれないし、ないかもしれない値を含む を持っています。
したがって、通常の動作は、次のようにインデクサーを使用することです。
object result = myDictionary["key"];
ただし、"key"
が辞書にない場合は がスローされるKeyNotFoundException
ため、代わりに次のようにします。
object val;
if (!myDictionary.TryGetValue("key", out val))
{
val = ifNotFound;
}
これは問題ありませんが、これらを連続して大量に保持できることを除けば、TryGetValue
ひどく不格好に感じ始めます。
したがって、オプション 1 は拡張メソッドです。
public static TValue TryGet<TKey, TValue>(
this Dictionary<TKey, TValue> input,
TKey key,
TValue ifNotFound = default(TValue))
{
TValue val;
if (input.TryGetValue(key, out val))
{
return val;
}
return ifNotFound;
}
これにより、次のことができます。
object result = myDictionary.TryGet("key1") ?? ifNotFound;
int i = anotherDictionary.TryGet("key2", -1);
これは単純ですが、既存のインスタンス メソッドに似た名前の拡張メソッドを追加すると、混乱が生じ、保守性が低下する可能性があります。また、欠落しているキーを処理するディクショナリのインデクサー セットとも一致しません。
したがって、オプション 2 は、IDictionary<TKey, TValue>
からの暗黙的なキャストを使用したの新しい実装ですが、をスローする代わりにDictionary<TKey, TValue>
返すインデクサーです。default(TValue)
KeyNotFoundException
それは私にやらせてください:
ForgivingDictionary<string, object> dict = myDictionary;
object val = dict["key"] ?? ifNotFound;
// do stuff to val, then...
dict["key"] = val;
そのため、get 値と set 値は一貫していますが、値の型はより複雑で、ForgivingDictionary
より多くのコードが必要になります。
どちらの方法も「面倒」に見えます-.Netでこれを行うより良い方法はありますか?
どちらの方法も妥協して混乱を招く可能性がありますが、一方が他方より明白/明確ですか? なぜ?