如何使用DefaultIfEmpty

时间:2019-07-05 06:46:43

标签: c# .net linq

我正在使用下面的代码来计算用户在问题答案列表中的分数,但获取错误序列不包含匹配元素。

现在在这里,我尝试选择问题的第一个选定选项并对该选项进行总分。但是,当没有选择任何选项时,它说没有找到匹配的元素,因此我添加了DefaultIfEmpty,但仍然抛出相同的错误。

现在,如果我使用FirstOrDefault,则会得到空值,那么我必须在Sum中添加空值检查,这看起来不合适。我应该在FirstOrDefault中提供默认值吗?

int Score = Questions.Select(x => x.Options.First(o => o.IsSelected))
                     .DefaultIfEmpty()
                     .Sum(s => s == null ? 0 : s.Score);

那么编写此linq查询的最佳方法是什么。

1 个答案:

答案 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()的调用相同的功能。