我正在从 LINQ 表达式生成一个十进制值列表,我想要最小的非零值。但是,LINQ 表达式完全有可能生成一个空列表。
这将引发异常,并且没有 MinOrDefault 来应对这种情况。
decimal result = (from Item itm in itemList
where itm.Amount > 0
select itm.Amount).Min();
如果列表为空,如何将结果设置为 0?
最佳答案
你要的是这个:
IEnumerable<double> results = ... your query ...
double result = results.MinOrDefault();
嗯,MinOrDefault()
不存在。但如果我们自己实现它,它看起来会像这样:
public static class EnumerableExtensions
{
public static T MinOrDefault<T>(this IEnumerable<T> sequence)
{
if (sequence.Any())
{
return sequence.Min();
}
else
{
return default(T);
}
}
}
但是,System.Linq
中的功能会产生相同的结果(方式略有不同):
double result = results.DefaultIfEmpty().Min();
如果 results
序列不包含任何元素,DefaultIfEmpty()
将生成一个包含一个元素的序列 - default(T)
-您随后可以调用 Min()
。
如果 default(T)
不是您想要的,那么您可以指定您自己的默认值:
double myDefault = ...
double result = results.DefaultIfEmpty(myDefault).Min();
现在,这很好!
关于c# - 如何在LINQ中实现 "MinOrDefault"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2165605/