使用Min或Max时如何处理LINQ中的空值?

我有以下Linq查询:

result.Partials.Where(o => o.IsPositive).Min(o => o.Result) 

当result.Partials.Where(o => o.IsPositive)不包含元素时,我得到一个exception。 除了将操作分成两部分并检查null之外,还有一种优雅的方法来处理这个吗? 我有一个像这样的操作的课程。

编辑:这个问题与LINQ to Objects有关。

这是我得到的例外(翻译它说:序列是空的):

在此处输入图像描述

Min的计算的简短摘要

  var min = result.Partials.Where(o => o.IsPositive).Min(o => o.Result); 

这是你的情况:如果没有匹配的元素,那么Min调用将引发exception( InvalidOperationException )。

  var min = result.Partials.Where(o => o.IsPositive) .Select(o => o.Result) .DefaultIfEmpty().Min(); 

当列表中没有元素时, DefaultIfEmpty将在0元素上创建枚举。 你怎么知道0是Min或0代表没有元素的列表?

  var min = result.Partials.Where(o => o.IsPositive) .Min(o => (decimal?)o.Result); 

这里min为null( defaul(decimal?) )或实际的最小值。 所以这个结果的消费者会知道,如果结果为null,那么列表没有元素,当结果是十进制值时,列表中有一些元素,这些元素的Min就是那个值。

但是,当这无关紧要时,可以调用min.GetValueOrDefault(0)

您可以使用DefaultIfEmpty方法确保集合至少包含1个项目:

 result.Partials.Where(o => o.IsPositive).Select(o => o.Result).DefaultIfEmpty().Min(); 

如果序列为空,则不能使用Min (或Max )。 如果不应该发生这种情况,那么您在定义result遇到了不同的问题。 否则,您应检查序列是否为空并正确处理,例如:

 var query = result.Partials.Where(o => o.IsPositve); min = query.Any() ? query.Min(o => o.Result) : 0; // insert a different "default" value of your choice...