Подтвердить что ты не робот

Как заставить LINQ Max-функцию вернуть значение по умолчанию, если последовательность пуста?

У меня есть этот код:

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

Я хочу, чтобы убедиться, что если в списке нет элементов, он должен использовать значение по умолчанию для int (0). Но вместо этого бросается InvalidOperationException, заявляя, что "Последовательность не содержит элементов".

Конечно, я мог бы использовать Any или синтаксис запроса (как в здесь). Но я хочу сделать это, используя свободный синтаксис.

Как я могу это исправить?

4b9b3361

Ответ 1

Попробуйте следующее:

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

LINQ DefaultIfEmpty - метод проверяет, является ли последовательность пустой. Если это так, он вернет одноэлементную последовательность: последовательность, содержащая ровно один элемент. Этот один элемент имеет значение по умолчанию для типа последовательности. Если последовательность содержит элементы, метод DefaultIfEmpty просто вернет сама последовательность.

Дополнительную информацию см. в MSDN.

Ответ 2

Слегка касательная, но, возможно, еще полезная.. Еще одно решение заключается в том, чтобы присвоить значение типу NULL,

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

Ответ 3

Если вы используете Enumerable.Aggregate, вам не понадобится никакой специальной обработки для случая пустого списка. Попробуй это:

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

Ответ 4

Как насчет расширения?

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