Answers:
假设如果键确实存在,则要获取值,请使用Dictionary<TKey, TValue>.TryGetValue
:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(ContainsKey
然后使用索引器使它两次查找关键字,这是毫无意义的。)
请注意,即使你是使用引用类型,为空检查是行不通的-索引的Dictionary<,>
,如果你请求一个丢失的钥匙将抛出一个异常,而不是返回null。(Dictionary<,>
和之间有很大的区别Hashtable
。)
ContainsKey
,这是正确的,因为它还必须提取值。但是,它没有进行两次查询。
如果字典KeyNotFound
不包含您的密钥,则字典会引发异常。
如所建议的,ContainsKey
是适当的预防措施。 TryGetValue
也有效。
这使字典可以更有效地存储null值。如果没有这种行为,则检查[]运算符的结果是否为空将指示是否为空值或输入键不存在,这是不好的。
如果您只是在尝试添加新值之前进行检查,请使用以下ContainsKey
方法:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
如果要检查值是否存在,请使用TryGetValue
Jon Skeet的答案中所述的方法。
GetValueElseAdd
方法,您可以给它们提供一个值(或Func<TValue>
),如果要添加的分辨率不存在,也可以将分辨率保存在“ Insert”上。我想没有将其放入.NET库的原因是因为如果在缓存
TryGetValue
会更好,但是如果要检查字典是否包含该键以避免重复添加,我会说ContainsKey
同样好(如果不是更好)。
在尝试提取值之前,应检查Dictionary.ContainsKey(int key)。
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
TryGetValue
。值得庆幸的是,我现在要做,所以以后我会知道的。尽管'cos讨论很有价值,但我将保持这个答案不变。
TryGetValue
在lambda表达式中使用。尽管这确实使我认为对C#的新扩展将是catch
类似于null
合并运算符的运算符。
辅助类很方便:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKey是您要寻找的。
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
如果字典中存在键,则它返回键的值,否则返回0。
希望这段代码对您有所帮助。
TryGetValue
足够了,请使用value
代替result
考虑封装此特定字典的选项,并提供一种方法以返回该键的值:
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
然后,您可以管理此词典的行为。
例如此处:如果字典没有键,它将返回您通过参数传递的键。