Linq emty结果问题

时间:2017-05-26 12:56:07

标签: c# linq

我有这样的疑问:

int cntR = res.Where(y => y.colour == "R" && y.branch == "QWERTY")
              .Select(z => new { z.Count })
              .SingleOrDefault().Count;

当结果不为空时,返回的类型为int。 但是当它是空的时,我有一个例外:

  

“对象引用未设置为对象的实例。”

我无法理解为什么SingleOrDefault()返回null但是int的默认值不是0?我尝试使用DefaultIfEmpty(0),但它没有编译。 有什么想法可以避免出现问题?

4 个答案:

答案 0 :(得分:4)

试试这个:

int cntR = res.Where(y => y.colour == "R" && y.branch == "QWERTY")
              .Select(z => new { z.Count })
              .SingleOrDefault()?.Count ?? 0;

注意null-conditional operatornull-coalescing operator

它仅适用于C#6.0及更高版本。

简要解释它是如何运作的:

SingleOrDefault()返回object或null。所以,OP尝试从null访问Count。为了防止这种情况,存在空条件运算符,因此.SingleOrDefault()?.Count返回null,如果SingleOrDefault()分别返回null。在这种情况下,Null-coalescing运算符用于默认值,当我们为null并期望它时。

答案 1 :(得分:1)

如果您实际选择了所需的值而不是匿名类,它应该按预期工作(假设Count属性是int)。

int cntR = res.Where(y => y.colour == "R" && y.branch == "QWERTY")
    .Select(z => z.Count)
    .SingleOrDefault();

答案 2 :(得分:0)

我有另一种解决方案。让我们附加一个虚拟数据:

Arrays.asList("Ole", "No").removeAll(Collections.singletonList("HopefullyHelpful"));

答案 3 :(得分:0)

我自己的解决方案是:

cntR = (res.Where(y => y.colour == "R" && x.RpId == y.branch).Select(z => new { z.Count }).SingleOrDefault()!=null)
                ? res.Where(y => y.colour == "R" && x.RpId == y.branch).Select(z => new { z.Count }).Single().Count
                : 0;

它有效=)