You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:53:10