如果序列为空,如何使LINQ的Max-function返回默认值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果序列为空,如何使LINQ的Max-function返回默认值?相关的知识,希望对你有一定的参考价值。

我有这个代码:

List<int> myList = new List<int>();
var max = myList.Max();
Console.Write(max);

我想要确保如果列表中没有元素,它应该使用int(0)的默认值。但相反,正在抛出InvalidOperationException,声明“序列不包含任何元素”。

当然我可以使用Any或查询语法(如here)。但我想用流利的语法来做。

我怎样才能解决这个问题?

答案

试试这个:

var myList = new List<int>();
var max = myList.DefaultIfEmpty().Max();
Console.Write(max);

LINQ的DefaultIfEmpty方法检查序列是否为空。如果是这种情况,它将返回一个单例序列:一个只包含一个元素的序列。这一个元素具有序列类型的默认值。如果序列确实包含元素,则DefaultIfEmpty方法将仅返回序列本身。

有关详细信息,请参阅MSDN

另一答案

如果使用Enumerable.Aggregate,则不需要对空列表大小写进行任何特殊处理。试试这个:

List<int> myList = new List<int>();
var max = myList.Aggregate(default(int), (seed, i) => (i > seed ? i : seed));
Console.Write(max);
另一答案

扩展怎么样?

public static int MaxOrDefault<T>(this IEnumerable<T> enumeration, Func<T, int> selector)
{
    return enumeration.Any() ? enumeration.Max(selector) : default(int);
}
另一答案

略微处于切线但可能仍然有用..另一种解决方案是将值转换为可空类型;

var myInt = new Int[0].Max(i=>(int?)i);//myInt == null

以上是关于如果序列为空,如何使LINQ的Max-function返回默认值?的主要内容,如果未能解决你的问题,请参考以下文章

linq DefautIfEmpty,Empty,Range,Repeat

Xamarin Studio 2 - 最新稳定更新 - 执行任务 Aapt 时出错:源序列为空

如果年龄列基于oracle中的出生日期列为空,如何更新年龄列?

Slick - 如果列为空,则过滤行

如果一个表列为空,如何从另一个表中获取值

如果列为空,我如何从 Mysql 的另一个表中导入一些列?