Не позволяйте списку быть нулевым
Убедитесь, что объект всегда находится в допустимом состоянии.Убедившись, что список никогда не равен нулю, вам никогда не нужно проверять, что список пуст.
public class MyClass
{
private readonly IEnumerable<int> ints;
public MyClass(IEnumerable<int> ints)
{
this.ints = ints;
}
public IEnumerable<int> IntsGreaterThan5()
{
return this.ints.Where(x => x > 5);
}
}
Даже если этот список пуст, вы все равно получите верный IEnumerable<int>
обратно.
Максимальные и минимальные перегрузки с типами Nullable
Это все еще не решает проблемы "Max" и "Min", хотя.Существует перегрузка Макс и Мин, которые принимают селекторы.Эти перегрузки селектора могут возвращать обнуляемые целые числа, поэтому ваш метод max становится следующим:
this.ints.Max(x => new int?(x));
Поэтому вы запускаете Max и проверяете, получили ли вы нулевое значение или целое число обратно.вуаля!
Другие параметры
Пользовательские методы расширения
Вы также можете написать свои собственные методы расширения.
public static MinMaxHelper()
{
public static int? MaxOrDefault(IEnumerable<int> ints)
{
if(!ints.Any())
{
return null;
}
return ints.Max();
}
public static int MaxOrDefault(IEnumerable<int> ints, int defaultValue)
{
if(!ints.Any())
{
return defaultValue;
}
return ints.Max();
}
}
Переопределение методов расширения Linq
И, наконец, помните, что сборка в методах расширения Linq может быть заменена вашими собственными методами расширения с соответствующими сигнатурами.Следовательно, вы можете написать метод расширения для замены .Where (...) и .Max (...), чтобы он возвращал null (или значение по умолчанию), вместо того, чтобы выдавать ArgumentNullException, если Enumerable равен null.