我有这 2 个列表 list1 和 list2 并创建了这个 GroupJoin:
List1 是人员列表(Id、姓名),list2 是对象列表(Id、Car、Date)。
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();
最佳答案
查看表达式 b?.Max
,看起来您期望表示内部列表相关元素的变量 b
将是 null
当没有匹配时。
但是GroupJoin文档明确指出:
If there are no correlated elements in
inner
for a given element ofouter
, the sequence of matches for that element will be empty but will still appear in the results.
所以 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()
关于c# - GroupJoin 返回序列不包含任何元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54914418/