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

Roy*_*mir 33 c# linq .net-4.0

我有这个代码:

List<int> myList = new List<int>();
var max = myList.Max();
Console.Write(max);
Run Code Online (Sandbox Code Playgroud)

我想要确保如果列表中没有元素,它应该使用int(0)的默认值.但是InvalidOperationException却被抛出,说明"序列不包含任何元素".

当然我可以使用Any或查询语法(如此处所示).但我想用流利的语法来做.

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

Spo*_*xus 75

试试这个:

var myList = new List<int>();
var max = myList.DefaultIfEmpty().Max();
Console.Write(max);
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请参阅MSDN

  • 请注意,`DefaultIfEmpty`还具有一个重载,该重载采用用户提供的默认值(不是OP要求的,而是我想要的) (3认同)

小智 7

一个扩展呢?

public static int MaxOrDefault<T>(this IEnumerable<T> enumeration, Func<T, int> selector)
{
    return enumeration.Any() ? enumeration.Max(selector) : default(int);
}
Run Code Online (Sandbox Code Playgroud)