Linq to objects:如果number在字典中,则返回number,否则返回0

时间:2011-07-02 15:19:01

标签: c# c#-4.0 linq-to-objects

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

6 个答案:

答案 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;

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