首页 > 解决方案 > GroupJoin 返回 Sequence 不包含任何元素

问题描述

我有这 2 个列表 list1 和 list2 并创建了这个 GroupJoin:

List1 是人员(Id、姓名)列表,list2 是对象(Id、汽车、日期)列表。

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();

标签: c#linq

解决方案


查看表达式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)

这适用于EnumerableQueryable实现。

仅适用于的第二种方法Enumerable是使用Select,DefaultIfEmpty和的组合Max

maxDate = b.Select(m => m.Date.Date).DefaultIfEmpty(new DateTime(2000, 01, 01)).Max()

推荐阅读