C# 使用LINQ基于属性值搜索嵌套列表元素并获取符合条件的最早日期
实现方案
完全可以通过LINQ实现该需求,核心借助SelectMany方法展平多层嵌套的集合,再做筛选排序即可,代码比循环实现更简洁易读,同时规避了参考实现中的逻辑漏洞。
最终LINQ代码
// 返回符合要求的最早日期,无匹配数据时返回DateTime.MinValue DateTime earliestSundayDate = customerOrder.OrderLines // 展平所有OrderLine下的OrderDate集合,把嵌套的二层列表变成一层OrderDate集合 .SelectMany(line => line.OrderDates) // 筛选Day字段为Sunday的记录 .Where(date => date.Day == "Sunday") // 按日期升序排列 .OrderBy(date => date.Date) // 取排序后第一条的Date值,无匹配则返回默认值 .Select(date => date.Date) .FirstOrDefault();
参考实现的已知问题
你提供的参考代码存在几处逻辑/写法错误,使用LINQ实现时可直接规避:
- 属性名不匹配:你定义的
OrderDate模型只有Day和Date两个属性,参考代码中误用了不存在的DateTypeId、ActualDate属性,运行会报错 - 空引用风险:若某条
OrderLine下没有符合条件的OrderDate,FirstOrDefault会返回null,直接访问属性会触发空引用异常 - 排序逻辑无效:
OrderBy方法返回新的排序后序列,不会修改原dates列表,原代码最终取到的是未排序的第一个元素,不符合「取最早日期」的需求
内容的提问来源于stack exchange,提问作者Bhav
相关产品推荐
相关产品推荐

