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)
可以调用.
您可以使用该DefaultIfEmpty
方法确保集合至少包含1个项目:
result.Partials.Where(o => o.IsPositive).Select(o => o.Result).DefaultIfEmpty().Min();
Run Code Online (Sandbox Code Playgroud)
如果序列为空,则不能使用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)
归档时间: |
|
查看次数: |
29038 次 |
最近记录: |