我有这2个列表list1和list2,并创建了此GroupJoin:
List1是人员(标识,名称)列表,list2是对象(标识,汽车,日期)列表。
PS:list1包含大约40个元素,而list2目前仅包含一个元素。
我尝试设置maxDate,但出现错误“序列不包含任何元素”
var result = list1.GroupJoin(list2,
l1 => l1.Id,
l2 => l2.Id
(a, b) => new
{
listA = a,
maxDate = b?.Max(m => m.Date).Date ??
new DateTime(2000, 01, 01)
}).ToList();
答案 0 :(得分:3)
查看表达式b?.Max
,看起来您期望没有内部匹配的变量b
将代表null
,该变量代表内部列表的相关元素。
但是GroupJoin文档明确指出:
如果
inner
中outer
中没有相关元素,则该元素的匹配顺序将为空,但仍会出现在结果中。
因此,b
永远不会null
,并且Max
在为空时会引发有问题的异常。
您可以通过两种方式解决它。
首先是使用Max
的可为空的重载,该重载返回null
而不是在空序列上引发异常:
maxDate = b.Max(m => (DateTime?)m.Date.Date) ?? new DateTime(2000, 01, 01)
这对于Enumerable
和Queryable
的实现都很好。
仅适用于Enumerable
的第二种方法是使用Select
,DefaultIfEmpty
和Max
的组合:
maxDate = b.Select(m => m.Date.Date).DefaultIfEmpty(new DateTime(2000, 01, 01)).Max()