我有这样的疑问:
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)
,但它没有编译。
有什么想法可以避免出现问题?
答案 0 :(得分:4)
试试这个:
int cntR = res.Where(y => y.colour == "R" && y.branch == "QWERTY")
.Select(z => new { z.Count })
.SingleOrDefault()?.Count ?? 0;
注意null-conditional operator和null-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;
它有效=)