我尝试检查 null,但编译器警告说这种情况永远不会发生。我应该找什么?
如果您只是在尝试添加新值之前进行检查,请使用 ContainsKey方法:
ContainsKey
if (!openWith.ContainsKey("ht")) { openWith.Add("ht", "hypertrm.exe"); }
如果您正在检查该值是否存在,请使用 Jon Skeet 的答案中描述的 TryGetValue方法。
TryGetValue
在尝试提取值之前,应该检查 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. }
ContainsKey 就是您要寻找的。
你或许应该使用:
if(myDictionary.ContainsKey(someInt)) { // do something }
不能检查 null 的原因是这里的键是一个值类型。
假设您希望在键 是的存在的情况下获取该值,那么使用 Dictionary<TKey, TValue>.TryGetValue:
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,然后使用索引器使其向上查找两次密钥,这是非常无意义的。)
请注意,即使您使用引用类型的 曾经是,检查 null 也不会起作用——如果您请求丢失的键,Dictionary<,>的索引器将抛出异常,而不是返回 null。(这是 Dictionary<,>和 Hashtable之间的一个很大的区别。)
Dictionary<,>
Hashtable
如果字典不包含您的键,则字典引发 KeyNotFound异常。
KeyNotFound
正如所建议的,ContainsKey是适当的预防措施。 TryGetValue也是有效的。
这允许字典更有效地存储 null 值。如果没有这种行为,检查来自[]操作符的 null 结果将表明要么是 null 值,要么是输入键不存在,这是不好的。
Helper 类很方便:
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; } }
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
如果字典中存在该键,则返回该键的值,否则返回0。
霍普,这个密码对你有帮助。
考虑封装这个特定字典的选项,并提供一个方法来返回该键的值:
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; } }
然后你就可以管理这本字典的行为了。
例如这里: 如果字典没有密钥,它将返回您通过参数传递的密钥。