在Python中,如果我有一个字典,并且我想从字典中获取密钥可能不存在的值,我会做类似的事情:
lookupValue = somedict.get(someKey, someDefaultValue)
其中,如果someKey
不存在,则返回someDefaultValue
。
在C#中,TryGetValue()
有点类似:
var lookupValue;
if(!somedict.TryGetValue(someKey, lookupValue))
lookupValue = someDefaultValue;
虽然有一个问题是,如果someKey
为null
,则会抛出异常,因此您将进行空检查:
var lookupValue = someDefaultValue;
if (someKey != null && !somedict.TryGetValue(someKey, lookupValue))
lookupValue = someDefaultValue;
哪个,TBH,icky(dict查找3行?)是否有更简洁(即1行)的方式,就像Python的get()
?
答案 0 :(得分:4)
这是使用TryGetValue
的正确方法。请注意,在调用TryGetValue
之前,您无法将返回值设置为默认值,只需将其返回为TryGetValue
,如果找不到该键,则会将其重置为默认值。
public static TValue GetOrDefault<TKey, TValue>(
this IDictionary<TKey, TValue> dictionary,
TKey key,
TValue defaultValue)
{
TValue value;
if(key == null || !dictionary.TryGetValue(key, out value))
return defaultValue;
return value;
}
当然,如果密钥为null
,您实际上可能需要例外,因为它始终是字典的无效密钥。
答案 1 :(得分:1)
TryGetValue不是您要寻找的方法。此方法返回一个布尔值。如果找到密钥则为true,否则为false。如果找到密钥,则将值设置为您选择的变量。您想要的方法在Dictonary类中不存在。 因此,您有两种方法可以解决问题:
检查是否存在:
var value;
if (somedic.TryGetValue("key", out value))
lookupValue = value;
else
lookupValue = defaultValue;
创建您自己的方法,如blog所示。
答案 2 :(得分:1)
LINQ的SingleOrDefault()可以解决问题。
string s = "I can't believe how ugly this is!";
Dictionary<char, int> histogram = new Dictionary<char, int>();
foreach (char c in s)
{
histogram[c] = histogram.Where(x => x.Key == c).SingleOrDefault().Value + 1;
}
不是很简洁或可读,但是,嘿,它是一个单行!
效率方面我不确定这会归结为什么。
当然,一旦您开始了LINQ路径,您可能会开始考虑其他方法来解决您正在处理的任何问题。