有没有办法以影响所有泛型类的方式在C#中的以下异常中获取给定键的值?我认为这是微软的异常描述中的一个重大错误。
"The given key was not present in the dictionary."
更好的方法是:
"The given key '" + key.ToString() + "' was not present in the dictionary."
解决方案可能涉及mixins或派生类。
答案 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”字符串。