我有一个简单的单行 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
,即 where 的实例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()
在它不为空时调用,但我很好奇它是否可以内联完成。