c# - 如何在LINQ中实现 "MinOrDefault"?

标签 c# linq min

我正在从 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/

相关文章:

c# - 如何使用 Entity Framework/LINQ 从特定表中提取元组列表?

c# - 按列表中的子属性排序

mysql - 如何在内部联接中选择第二个最小值?

mysql - 如何在 MySQL 中查询高于 MIN 的 X

c# - Entity Framework : Storing Entities without saving to Database

c# - 在 <td></td> 标签内显示变量的值

c# - Winform 的所见即所得控件

c# - 如何将 processid 添加到 log4net 布局?

c# - LINQ to Entities 无法识别方法 IsUserInCc

python - 在平局的情况下随机选择最大值?