我正在使用下面的代码来计算用户在问题答案列表中的分数,但获取错误序列不包含匹配元素。
现在在这里,我尝试选择问题的第一个选定选项并对该选项进行总分。但是,当没有选择任何选项时,它说没有找到匹配的元素,因此我添加了DefaultIfEmpty
,但仍然抛出相同的错误。
现在,如果我使用FirstOrDefault
,则会得到空值,那么我必须在Sum中添加空值检查,这看起来不合适。我应该在FirstOrDefault
中提供默认值吗?
int Score = Questions.Select(x => x.Options.First(o => o.IsSelected))
.DefaultIfEmpty()
.Sum(s => s == null ? 0 : s.Score);
那么编写此linq查询的最佳方法是什么。
答案 0 :(得分:3)
在编写代码时,您正在针对所有问题的选项集调用DefaultIfEmpty
,因此只要问题集不为空,它就不会起作用。正如您所指出的那样,鉴于存在一个没有选择的选项的问题,对First
的内部调用将引发。
如果要使用DefaultIfEmpty
,则可以在选项集合上进行以下操作:
int Score = Questions.Select(x => x.Options
.Where(o => o.IsSelected)
.Select(o => o.Score)
.DefaultIfEmpty()
.First()
)
.Sum();
在这里,由于在调用DefaultIfEmpty
之前先投影到整数集合,所以在空情况下它将产生一个单例集合,其中有0,因为int
的默认值为0。但是,在这种情况下,FirstOrDefault
将实现与对DefaultIfEmpty().First()
的调用相同的功能。