给定的密​​钥不在字典中。哪个关键?

时间:2014-10-07 20:06:02

标签: c# exception generics dictionary

有没有办法以影响所有泛型类的方式在C#中的以下异常中获取给定键的值?我认为这是微软的异常描述中的一个重大错误。

"The given key was not present in the dictionary."

更好的方法是:

"The given key '" + key.ToString() + "' was not present in the dictionary."

解决方案可能涉及mixins或派生类。

5 个答案:

答案 0 :(得分:55)

当您尝试索引不存在的内容时,抛出此异常,例如:

Dictionary<String, String> test = new Dictionary<String,String>();
test.Add("Key1,"Value1");
string error = test["Key2"];

通常情况下,像物体这样的东西将成为关键,这无疑会让它变得更难。但是,您始终可以编写以下内容(或者甚至将其包装在扩展方法中):

if (test.ContainsKey(myKey))
   return test[myKey];
else
   throw new Exception(String.Format("Key {0} was not found", myKey));

或更高效(感谢@ScottChamberlain)

T retValue;
if (test.TryGetValue(myKey, out retValue))
    return retValue;
else
   throw new Exception(String.Format("Key {0} was not found", myKey));

微软选择不这样做,可能是因为它在大多数对象上使用时都没用。它很简单,可以自己做,所以只需滚动自己!

答案 1 :(得分:14)

在一般情况下,答案是否。

但是,您可以将调试器设置为在首次抛出异常时中断。那时,不存在的密钥将作为调用堆栈中的值访问。

在Visual Studio中,此选项位于此处:

Debug→Exceptions ...→公共语言运行时异常→System.Collections.Generic

在那里,您可以查看投掷框。


对于运行时需要信息的更具体的实例,如果您的代码使用IDictionary<TKey, TValue>而不直接绑定到Dictionary<TKey, TValue>,则可以实现自己的字典类来提供此行为。

答案 2 :(得分:6)

如果您想管理关键未命中,您应该使用TryGetValue

https://msdn.microsoft.com/en-gb/library/bb347013(v=vs.110).aspx

string value = "";
if (openWith.TryGetValue("tif", out value))
{
    Console.WriteLine("For key = \"tif\", value = {0}.", value);
}
else
{
    Console.WriteLine("Key = \"tif\" is not found.");
}

答案 3 :(得分:1)

您可以尝试使用此代码

Dictionary<string,string> AllFields = new Dictionary<string,string>();  
string value = (AllFields.TryGetValue(key, out index) ? AllFields[key] : null);

如果键不存在,它只会返回一个空值。

答案 4 :(得分:-1)

string Value = dic.ContainsKey("Name") ? dic["Name"] : "Required Name"

使用此代码,我们将在'Value'中获取字符串数据。如果字典“ dic”中存在键“ Name”,则获取此值,否则返回“ Required Name”字符串。