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

如何使用LINQ基于时间差去除重复的Checkup数据

针对Checkup集合的20分钟内重复项去重方案

为什么按Ticks分组会失效

按固定时间间隔(比如20分钟)的Ticks值分组,会出现边界误判:比如一条记录在10:19,另一条在10:25,两者时间差6分钟≤20,但会被分到不同的20分钟区间组,导致无法识别为重复;反之,若两条记录跨区间但实际差超过20分钟,却可能被错误归为同一组。这种分组逻辑无法准确匹配“任意两条记录时间差≤20分钟即视为重复”的需求。

正确实现思路

  1. 先按SubjectGuid和DoctorGuid组合键分组,仅处理同一医患配对的记录;
  2. 每个分组内按Date降序排序,优先保留最新记录;
  3. 遍历排序后的记录,仅保留与已保留的最新记录时间差超过20分钟的条目(或第一条记录)。

代码实现

假设Checkup类定义如下:

public class Checkup
{
    public Guid SubjectGuid { get; set; }
    public Guid DoctorGuid { get; set; }
    public DateTime Date { get; set; }
}

去重的LINQ实现:

var deduplicatedCheckups = checkups
    // 按医患配对分组
    .GroupBy(c => new { c.SubjectGuid, c.DoctorGuid })
    .SelectMany(group => 
        // 分组内按时间从新到旧排序
        group.OrderByDescending(c => c.Date)
             // 累积筛选符合条件的记录
             .Aggregate(new List<Checkup>(), (resultList, current) =>
             {
                 // 第一条直接加入,或当前记录与最后一条保留记录时差超20分钟才加入
                 if (!resultList.Any() || (resultList.Last().Date - current.Date).TotalMinutes > 20)
                 {
                     resultList.Add(current);
                 }
                 return resultList;
             }));

代码说明

  • 分组逻辑确保只处理同一医患的记录,避免跨配对误判;
  • 降序排序保证优先保留最新记录,符合“保留20分钟内最新记录”的需求;
  • Aggregate方法遍历过程中,只保留与已选记录时差超过20分钟的条目,精准过滤掉时间范围内的重复项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:22:33