如何从包含DateTime类型AcceptanceDate属性的对象集合中获取第二新日期对应的对象?
没问题,这个需求用LINQ完全能搞定,而且思路特别清晰——核心就是先按日期排序,再精准定位到第二新的对象。我给你两种常用实现方式,适配不同场景:
方案1:无重复日期场景(最直接)
如果你的列表中所有AcceptanceDate都是唯一的,直接按日期降序排序后跳过第一个(最新的),取剩下的第一个就是第二新的对象:
// 先定义你的对象类型 public class WorkItem { public string number { get; set; } public DateTime AcceptanceDate { get; set; } public string type { get; set; } } // 示例数据初始化 var workItems = new List<WorkItem> { new WorkItem { number = "X76-M1-20/2", AcceptanceDate = DateTime.Parse("2020-07-30T00:00:00Z"), type = "Done" }, new WorkItem { number = "X75-M1-18/2", AcceptanceDate = DateTime.Parse("2018-03-04T00:00:00Z"), type = "Done" }, new WorkItem { number = "X66-M1-20/1", AcceptanceDate = DateTime.Parse("2020-02-12T00:00:00Z"), type = "Done" }, new WorkItem { number = "X77-M1-17/1", AcceptanceDate = DateTime.Parse("2017-02-14T00:00:00Z"), type = "Done" } }; // 核心逻辑 var secondNewestItem = workItems .OrderByDescending(item => item.AcceptanceDate) // 从最新到最旧排序 .Skip(1) // 跳过第一个(最新的对象) .FirstOrDefault(); // 取剩下的第一个,即第二新的 // 输出结果:X66-M1-20/1 Console.WriteLine(secondNewestItem?.number);
代码说明
OrderByDescending确保列表按日期从新到旧排列,这是实现的关键;Skip(1)跳过排序后的第一个元素(也就是最新的对象);FirstOrDefault比First更安全,当列表元素不足2个时会返回null,避免空引用异常。
方案2:存在重复日期场景(更严谨)
如果列表中可能有多个对象共享同一个最新日期,你需要先按日期分组,再取第二个日期组的对象(也就是第二新的日期对应的所有对象):
var secondNewestDateGroup = workItems .GroupBy(item => item.AcceptanceDate) // 按日期分组,相同日期的对象归为一组 .OrderByDescending(group => group.Key) // 按日期从新到旧排序分组 .Skip(1) // 跳过最新的日期组 .FirstOrDefault(); // 取第二新的日期组 // 从分组中取第一个对象(如果需要所有同日期对象,直接用secondNewestDateGroup即可) var secondNewestItem = secondNewestDateGroup?.FirstOrDefault();
代码说明
GroupBy把相同日期的对象聚合在一起,避免出现“跳过一个最新对象但还有其他同日期对象”的情况;- 排序和跳过逻辑和方案1一致,但针对的是日期分组而非单个对象,结果更严谨。
注意事项
- 确保
AcceptanceDate是DateTime类型,如果原数据是字符串,一定要先解析成DateTime(比如用DateTime.Parse或DateTime.TryParse),否则字符串排序会出错; - 处理列表元素不足2个的情况:比如列表为空或只有1个元素时,
FirstOrDefault会返回null,记得在使用前做null校验; - 如果需要第二新日期的所有对象,方案2中直接返回
secondNewestDateGroup即可,不用再取FirstOrDefault。
内容的提问来源于stack exchange,提问作者Taieb
相关产品推荐
相关产品推荐

