c# - GroupJoin 返回序列不包含任何元素

标签 c# linq

我有这 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 of outer, 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)

这适用于 EnumerableQueryable 实现。

仅适用于 Enumerable 的第二种方法是结合使用 SelectDefaultIfEmptyMax :

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

关于c# - GroupJoin 返回序列不包含任何元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54914418/

相关文章:

c# - Enum.HasFlag 中的意外结果

c# - LINQ 查询以使用子详细信息展平主/详细信息

c# - 如何调用 Dictionary<K, V>.TryGetValue() where K : Predicate<T>, V : enum

c# - 为什么这个 Linq 方法接受表达式类型的参数

c# - 如何在 LINQ 中使用字符串进行查询

c# - 通过方法调用将自定义对象传递给 DLL

c# - C++中的委托(delegate)

c# - 每个 new System.Threading.Tasks.Task() 都会创建一个新线程吗?

c# - 创建一个 LINQ 查询,其中包含本周的所有条目(今天和昨天除外)

c# - DataGrid - 新数据到达时重置网格选择