我想要的只是一本字典,它告诉我找不到哪个键,而不只是说The given key was not present in the dictionary
。
我简单地考虑过使用override new this[TKey key]
做一个子类,但觉得它有点hacky,所以我已经实现了IDictionary接口,并将所有内容直接传递给内部Dictionary,只有其他逻辑在索引器中:
public TValue this[TKey key]
{
get
{
ThrowIfKeyNotFound(key);
return _dic[key];
}
set
{
ThrowIfKeyNotFound(key);
_dic[key] = value;
}
}
private void ThrowIfKeyNotFound(TKey key)
{
if(!_dic.ContainsKey(key))
throw new ArgumentOutOfRangeException("Can't find key [" + key + "] in dictionary");
}
这是正确/唯一的方法吗?会不会对这个[]真的那么糟糕?
答案 0 :(得分:10)
听起来非常适合扩展方法:
public static class SomeUtilClass {
public static TValue VerboseGetValue<TKey, TValue>(
this IDictionary<TKey, TValue> data, TKey key)
{
TValue result;
if (!data.TryGetValue(key, out result)) {
throw new KeyNotFoundException(
"Key not found: " + Convert.ToString(key));
}
return result;
}
}
每当您致电VerboseGetValue
时,这将适用于您现有的所有词典,例如:
var data = new Dictionary<int, string> { { 123, "abc" } };
Console.WriteLine(data.VerboseGetValue(123));
Console.WriteLine(data.VerboseGetValue(456));
答案 1 :(得分:3)
在触摸基础字典之前,不要进行ContainsKey并检查是否存在密钥,为什么不这样做
get {
try {
return _dic[key];
}
catch (ArgumentOutOfRangeException) {
throw new ArgumentOutOfRangeException(......);
}
}
这样,你只需支付失败案例中的额外检查 - 成功案例,希望更常见,不必进行额外的字典查找。这对get来说很有用,但set更难,因为set的默认行为始终有效。如果您不想这样,那么您需要首先检查密钥是否存在。
答案 2 :(得分:1)
如果你想这样做,你将不得不以这种或那种方式推销自己。但我会问你为什么要这样做?