c# - 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();
解决方案
查看表达式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()
推荐阅读
- c++ - unresolved external symbol CORBA server
- ios - ReactNative iOS UNUserNotificationCenter:实现 didReceiveNotificationResponse
- ruby-on-rails - 将用户头像从资产/图像更改为图片
- linux - 有没有办法在linux中进行事件订阅
- javascript - 如何仅通过路由器链接访问 Vue.js 中的路由
- python - 使用不同的配置运行 Python
- javascript - How to install Node.js packages from Git repository inside specific folders
- php - 根据范围从收据簿中获取缺失的数字
- r - 嵌套循环错误:矩阵上的下标数量不正确
- c++ - 在 std::string::end() 和 std::string::capacity() 之间使用缓冲区