【发布时间】:2011-01-09 11:40:16
【问题描述】:
我尝试检查 null 但编译器警告这种情况永远不会发生。我应该寻找什么?
【问题讨论】:
标签: c# dictionary
我尝试检查 null 但编译器警告这种情况永远不会发生。我应该寻找什么?
【问题讨论】:
标签: c# dictionary
假设您想在键确实存在的情况下获取值,请使用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 之间的一个很大区别。)
【讨论】:
ContainsKey 做了更多的工作,这是真的,因为它也必须提取价值。但它并没有进行两次查找。
如果字典不包含您的密钥,字典会引发 KeyNotFound 异常。
正如建议的那样,ContainsKey 是适当的预防措施。 TryGetValue也有效。
这允许字典更有效地存储 null 值。如果没有这种行为,检查 [] 运算符的空结果将指示空值或输入键不存在,这是不好的。
【讨论】:
如果您只是在尝试添加新值之前进行检查,请使用ContainsKey 方法:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
如果您要检查该值是否存在,请使用 Jon Skeet 的回答中所述的 TryGetValue 方法。
【讨论】:
GetValueElseAdd 方法,如果您要在不存在的情况下添加,则您可以给这些方法一个值(或Func<TValue>)来保存插入上的分辨率。我想没有进入.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。虽然这确实让我认为 C# 的新扩展将是类似于 null 合并运算符的 catch 运算符。
辅助类很方便:
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 是你要找的。p>
【讨论】:
您可能应该使用:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
不能检查null的原因是这里的key是值类型。
【讨论】:
考虑封装这个特定字典的选项,并提供一种方法来返回该键的值:
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;
}
}
然后你可以管理这个字典的行为。
例如这里:如果字典没有键,则返回您通过参数传递的键。
【讨论】:
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
如果键存在于字典中,则返回键的值,否则返回 0。
希望这段代码能帮到你。
【讨论】:
TryGetValue 就够了,用value 代替result