У меня есть простой однострочный запрос linq, чтобы найти элементы в списке, которые содержат наибольшее значение свойства, и создать новый список с ними, только если существует определенное количество элементов, соответствующих этому критерию. Например:
List<MyObject> objects = new List<MyObject>()
{
new MyObject() { MyValue = 6 },
new MyObject() { MyValue = 7 },
new MyObject() { MyValue = 7 },
new MyObject() { MyValue = 8 },
new MyObject() { MyValue = 8 },
};
int countRequired = 2;
List<MyObject> highestValue2Required = objects.GroupBy( o => o.MyValue )
.OrderByDescending( g => g.Key )
.Where( g => g.Count() == countRequired )
.FirstOrDefault()
.ToList();
Если в моем списке есть данные, удовлетворяющие этим условиям, будет создан новый список, содержащий два экземпляра MyObject
, где MyValue = 8
.
Однако, если нет данных, соответствующих критериям, я получаю исключение, потому что IGrouping
результат запроса равен нулю, и вызов ToList()
для этого не работает. Например:
int countRequired = 3;
List<MyObject> highestValue3Required = objects.GroupBy( o => o.MyValue )
.OrderByDescending( g => g.Key )
.Where( g => g.Count() == countRequired )
.FirstOrDefault()
.ToList();
Поскольку в списке есть только два экземпляра MyObject
, где MyValue
равно наибольшему значению (равному 8), запрос вызывает исключение
System.ArgumentNullException: 'Value cannot be null.
Возможно ли это нулевое значение для возврата пустого списка в моем запросе "одна строка"?
Очевидный способ сделать это состоит в том, чтобы удалить вызов ToList()
и просто вернуть результат IGrouping
, и вызывать ToList()
только тогда, когда он не равен нулю, но мне любопытно, можно ли это сделать в соответствии.