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

按ID分组对象数组,按状态优先+最早日期筛选记录

按ID分组筛选记录:优先选取Status=3,无则取最早LastModified

需求:处理包含重复ID的对象数组,按ID分组后,每组优先选取Status为3的记录;若该组没有Status=3的记录,则选取LastModified最早的记录。

示例输入数据

ID     Status  Last     LastModified             
1      1       Smith    02/06/2023 04:00 AM   
1      2       Smith    02/06/2023 02:00 AM   
2      1       Jones    02/01/2023 11:24 AM        
3      1       Jack     02/05/2023 02:00 AM   
3      3       Jack     02/06/2023 06:00 AM   

期望输出结果

ID     Status  Last     LastModified             
1      2       Smith    02/06/2023 02:00 AM   
2      1       Jones    02/01/2023 11:24 AM        
3      3       Jack     02/06/2023 06:00 AM   

现有代码及输出

当前仅实现了按日期筛选的逻辑,无法优先选取Status=3的记录:

var filtered = from d in tests.AsEnumerable()
                 group d by d.ID into g
                 select g.OrderBy(p => p.DateTime).FirstOrDefault(); 

这段代码的输出:

ID     Status  Last     LastModified             
1      2       Smith    02/06/2023 02:00 AM   
2      1       Jones    02/01/2023 11:24 AM        
3      1       Jack     02/05/2023 02:00 AM   

解决方案

修改Linq的排序逻辑,先按Status是否为3确定优先级,再按LastModified排序:

var filtered = from d in tests.AsEnumerable()
               group d by d.ID into g
               select g.OrderBy(p => p.Status != 3) // 让Status=3的记录排在最前
                       .ThenBy(p => p.LastModified) // 无Status=3时,取最早的日期记录
                       .FirstOrDefault();

逻辑说明

  1. OrderBy(p => p.Status != 3):当Status=3时,p.Status !=3返回false,排序中false会排在true前面,因此该组内Status=3的记录会被优先放在最前面。
  2. ThenBy(p => p.LastModified):当组内没有Status=3的记录时,所有元素的p.Status !=3都为true,此时会按LastModified升序排序,取最早的那条记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:05:55