Linq to对象:如果数字在字典中,则返回数字,否则返回0
本文关键字:数字 返回 对象 to 如果 Linq 字典 | 更新日期: 2023-09-27 18:00:51
我有一个Dictionary<int int>
。当我检查Dictionary的键中是否有数字时,我希望它返回数字,否则我希望linq查询返回0。
类似以下内容,除了工作
var t = (from result in results
where result.Key == 3
select result.Key != null ? result.Value : 0).First();
因为问题是,当列表中没有数字时,序列中不包含任何元素,因此不能使用null或count进行检查。
只需使用TryGetValue
。
int i;
results.TryGetValue(3, out i);
如果它找到它,则i
被设置为该值。如果不是,则默认i
,对于内部为零
如果你想要除默认值之外的另一个值,你可以这样做:
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);
如果你想变得更漂亮,你可以创建另一个扩展的oveload:
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);
为什么不只是
var t = results.ContainsKey(3) ? results[3] : 0;
并完全绕过对LINQ的需求?
return results.ContainsKey(key) ? results[key] : 0;
听起来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。这不会使用散列码,所以它是一个缓慢的查找大O(n(。
var t = (from result in results
where result.Key == 3
select result.Key != null ? result.Value : 0).FirstOrDefault();
尝试var t = (from result in results where result.Key == 3 select result.Value).FirstOrDefault();
现在,要么您在where子句中有一个匹配项,所以select将投影正确的值,要么您有一个空序列。FirstOrDefault((然后返回值(如果存在(或0(整数的默认值(
选择值,然后:
ToArray().FirstOrDefault()