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

Ign*_*cia 32 .net c# linq null

我有以下Linq查询:

result.Partials.Where(o => o.IsPositive).Min(o => o.Result)
Run Code Online (Sandbox Code Playgroud)

当result.Partials.Where(o => o.IsPositive)不包含元素时,我得到一个异常.有没有一种优雅的方法来处理这个,除了将操作分成两部分并检查null?我有一个充满类似这样的操作的课程.

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

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

在此输入图像描述

Adr*_*ode 59

Min的计算的简短摘要

   var min = result.Partials.Where(o => o.IsPositive).Min(o => o.Result);
Run Code Online (Sandbox Code Playgroud)

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

 var min = result.Partials.Where(o => o.IsPositive)
                          .Select(o => o.Result)
                          .DefaultIfEmpty().Min();
Run Code Online (Sandbox Code Playgroud)

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

   var min = result.Partials.Where(o => o.IsPositive)
                            .Min(o => (decimal?)o.Result);
Run Code Online (Sandbox Code Playgroud)

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

但是,当这无所谓时,则min.GetValueOrDefault(0)可以调用.

  • 我想添加以下内容:如果您的属性可为空并且源集合可以包含“null”值,则获得“null”结果可能意味着两件事:集合没有元素,或者给定属性的所有值是“空”。 (2认同)

Ken*_*rey 8

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

result.Partials.Where(o => o.IsPositive).Select(o => o.Result).DefaultIfEmpty().Min();
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 7

如果序列为空,则不能使用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...    
Run Code Online (Sandbox Code Playgroud)