使用LINQ在空列表中应用count时返回0

时间:2017-05-03 14:29:55

标签: c# list linq

我正在制作一个列表,以便在应用下面的过滤器

后计算
ValueRaw = pCounts.Count() > 0 ? pCounts.SingleOrDefault(x => x.IsNew)?.Count : 0 
null为空时,

以上行返回pCounts.SingleOrDefault(x => x.IsNew)

如何更改它以返回0而不是null

2 个答案:

答案 0 :(得分:6)

你可以这样做(你不需要第一次检查):

ValueRaw = pCounts.SingleOrDefault(x => x.IsNew)?.Count ?? 0;

这使用了null Coalising运算符(参见here)。如果它不为空,则取其剩下的值,否则为其右边的值。

但是,您当然可以使用条件标记来编写它:

var temp = pCounts.SingleOrDefault(x => x.IsNew)?.Count;
ValueRaw = temp == null ? 0 : temp;

甚至更长时间使用if:

var temp = pCounts.SingleOrDefault(x => x.IsNew)?.Count;
if(temp == null)
    ValueRaw = 0;
else
    ValueRaw = temp;

答案 1 :(得分:3)

首先,不需要进行Count()检查。当集合为空时,SingleOrDefault将返回默认值(null)。因此,您的原始表达式可以简化为:

ValueRaw = pCounts.SingleOrDefault(x => x.IsNew)?.Count;

如果您希望ValueRaw在没有元素满足条件时为0,则可以使用null-coalescing运算符:

ValueRaw = pCounts.SingleOrDefault(x => x.IsNew)?.Count ?? 0;

这将为您提供满足条件的第一个元素的Count,或者如果没有这样的元素,则为0。特别是,集合中的元素本身必须是集合(否则您无法将Count应用于集合)。也许你真的打算使用Where

ValueRaw = pCounts.Where(x => x.IsNew).Count();

这将为您提供满足条件的元素数量。