使用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...