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

如何用LINQ筛选TFS中最后构建时间为2015年的唯一项目?

解决方案

没问题,我来帮你搞定这个需求!核心思路是先按项目分组,找到每个项目的最新构建记录,再筛选出最新构建时间在2015年及更早的项目,最后提取这些唯一的项目即可。

步骤拆解

  1. 按项目分组:把所有构建记录按所属项目归类,每个组对应一个项目的完整构建历史。
  2. 获取每个项目的最新构建:对每个项目组,找出FinishTime最晚的那条构建记录。
  3. 筛选符合条件的项目:判断该最新构建的年份是否小于2016(即2015年及更早)。
  4. 提取唯一项目:把符合条件的项目提取出来,得到最终的唯一项目列表。

代码实现

根据你使用的.NET版本,有两种简洁的写法:

1. .NET 6+ 版本(推荐,使用MaxBy方法)

MaxBy是.NET 6新增的方法,可以直接从集合中取指定字段最大的元素,代码更简洁直观:

var oldProjects = builds
    // 先过滤掉未完成的构建(避免空引用异常,有些构建可能还在运行中)
    .Where(b => b.FinishTime != null)
    // 按项目分组,每组包含该项目的所有构建记录
    .GroupBy(b => b.Project)
    // 对每个组,取最新的构建记录,并关联对应的项目
    .Select(group => new 
    {
        Project = group.Key,
        LatestBuild = group.MaxBy(b => b.FinishTime.Value)
    })
    // 筛选最新构建时间在2015年及更早的项目
    .Where(x => x.LatestBuild.FinishTime.Value.Year < 2016)
    // 提取项目对象
    .Select(x => x.Project)
    .ToList();

2. 旧版.NET(比如.NET Framework)

如果你的环境不支持MaxBy,可以用OrderByDescending+First来模拟获取最新构建:

var oldProjects = builds
    .Where(b => b.FinishTime != null)
    .GroupBy(b => b.Project)
    .Select(group => new 
    {
        Project = group.Key,
        LatestBuild = group.OrderByDescending(b => b.FinishTime.Value).First()
    })
    .Where(x => x.LatestBuild.FinishTime.Value.Year < 2016)
    .Select(x => x.Project)
    .ToList();

注意事项

  • 务必先过滤FinishTime为null的构建记录,避免空引用异常——毕竟有些构建可能还在运行中,没有完成时间。
  • 如果你的Build类中是用项目ID而非项目对象标识归属,只需把GroupBy(b => b.Project)改成GroupBy(b => b.ProjectId),后续提取项目时对应调整即可。

内容的提问来源于stack exchange,提问作者doorman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:19:15