40

我有这个代码:

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

我希望确保如果列表中没有元素,它应该使用int(0) 的默认值。而是InvalidOperationException抛出一个,说明“序列不包含任何元素”。

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

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

4

5 回答 5

96

试试这个:

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

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

有关详细信息,请参阅 MSDN

于 2012-11-08T08:11:37.013 回答
8

扩展名呢?

public static int MaxOrDefault<T>(this IEnumerable<T> enumeration, Func<T, int> selector)
{
    return enumeration.Any() ? enumeration.Max(selector) : default(int);
}
于 2019-01-30T16:36:08.057 回答
4

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

List<int> myList = new List<int>();
var max = myList.Aggregate(default(int), (seed, i) => (i > seed ? i : seed));
Console.Write(max);
于 2018-08-02T18:22:23.010 回答
3

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

var myInt = new Int[0].Max(i=>(int?)i);//myInt == null
于 2014-08-03T17:11:41.987 回答
0

作为一种扩展方法,@AlvaroRivoir 的解决方案可以通过进一步泛化添加另一个类型参数来扩展:

public static K MaxOrDefault<T, K>(this IEnumerable<T> enumeration, Func<T, K> selector) {
    return enumeration.Any() ? enumeration.Max(selector) : default;
}
于 2020-08-27T10:27:34.673 回答