如何使用LINQ基于时间差去除重复的Checkup数据
针对Checkup集合的20分钟内重复项去重方案
为什么按Ticks分组会失效
按固定时间间隔(比如20分钟)的Ticks值分组,会出现边界误判:比如一条记录在10:19,另一条在10:25,两者时间差6分钟≤20,但会被分到不同的20分钟区间组,导致无法识别为重复;反之,若两条记录跨区间但实际差超过20分钟,却可能被错误归为同一组。这种分组逻辑无法准确匹配“任意两条记录时间差≤20分钟即视为重复”的需求。
正确实现思路
- 先按
SubjectGuid和DoctorGuid组合键分组,仅处理同一医患配对的记录; - 每个分组内按
Date降序排序,优先保留最新记录; - 遍历排序后的记录,仅保留与已保留的最新记录时间差超过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
相关产品推荐
相关产品推荐

