我有Dictionary<int int>
。当我检查字典中的键的数字并且它在其中时,我希望它返回数字,否则我希望linq查询返回0。
如下所示,除了工作
var t = (from result in results
where result.Key == 3
select result.Key != null ? result.Value : 0).First();
因为问题是当列表中没有数字时,序列不包含任何元素,因此您无法使用null或count进行检查。
答案 0 :(得分:6)
只需使用TryGetValue
。
int i;
results.TryGetValue(3, out i);
如果找到,i
设置为该值。如果不是,i
是默认值,对于int将为零。
如果您想要除默认值之外的其他值,您可以这样做:
int i;
if (!results.TryGetValue(3, out i))
{
i = 5; // or whatever other value you want;
}
如果你像我一样讨厌out
参数样式,你可以创建一个扩展方法
public static class IDictionaryExtensions
{
public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
{
T i;
dictionary.TryGetValue(key, out i);
return i;
}
}
然后你可以打电话:
int i = dictionary.GetValueOrDefault(3);
如果你想变得更加漂亮,你可以创建另一个扩展名:
public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue)
{
T i;
return dictionary.TryGetValue(key, out i) ? i : defaultValue;
}
可以称为
int i = dictionary.GetValueOrDefault(3, 5);
答案 1 :(得分:3)
为什么不
var t = results.ContainsKey(3) ? results[3] : 0;
并完全绕过对LINQ的需求?
答案 2 :(得分:2)
return results.ContainsKey(key) ? results[key] : 0;
答案 3 :(得分:1)
听起来results
是你的字典。
Dictionary<int int> results = new Dictionary<int,int>{{1,1},{3,3}};
int value;
results.TryGetValue (4, out value);
return value;
value
为0
,因为TryGetValue
将其设置为default(int)
,当然是0
。
如果您想输入更多内容,可以使用linq,让阅读代码的人感到困惑,并减慢速度。这不会使用哈希码,所以它是一个慢速查找Big O(n)。
var t = (from result in results
where result.Key == 3
select result.Key != null ? result.Value : 0).FirstOrDefault();
答案 4 :(得分:0)
尝试var t = (from result in results where result.Key == 3 select result.Value).FirstOrDefault();
现在,要么在where子句中匹配,那么select将投影正确的值,或者您有一个空序列。然后,FirstOrDefault()返回值(如果存在)或0(整数的默认值。)
答案 5 :(得分:0)
选择值,然后:
ToArray().FirstOrDefault()