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进行检查。

Linq to对象:如果数字在字典中,则返回数字,否则返回0

只需使用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;

value0,因为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()