Как заставить LINQ Max-функцию вернуть значение по умолчанию, если последовательность пуста?
У меня есть этот код:
List<int> myList = new List<int>();
var max = myList.Max();
Console.Write(max);
Я хочу, чтобы убедиться, что если в списке нет элементов, он должен использовать значение по умолчанию для int
(0). Но вместо этого бросается InvalidOperationException
, заявляя, что "Последовательность не содержит элементов".
Конечно, я мог бы использовать Any
или синтаксис запроса (как в здесь). Но я хочу сделать это, используя свободный синтаксис.
Как я могу это исправить?
Ответы
Ответ 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);
}