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

如何使用LINQ过滤列表,按IdNumber保留RepID=26的记录?

解决方案:按IdNumber筛选RepID=26记录,无则设置默认值

需求说明

  • 每个IdNumber仅保留RepID=26的记录;
  • 若某个IdNumber不存在RepID=26的记录,则设置Amt=0、RepID=null。

初始数据

Id Number       Amt       RepID
23J011-001  $65,000     26
23J011-001  $38,000     28
23J011-001  $47,500     32
23J011-001  $40,000     45
23J011-001  $80,000     48
23J011-002  $95,000     26
23J011-002  $70,000     28
23J011-002  $95,000     32
23J011-002  $100,000    45
23J011-002  $75,000     48
23J011-003      
23J011-004  $50,000     29

期望结果

Id Number   Amt       RepID
23J011-001  $65,000     26
23J011-002  $95,000     26
23J011-003      
23J011-004      

问题分析

你之前用的Where(x => x.RepID == 26).DistinctBy(x => x.IdNumber)会直接过滤掉所有RepID≠26的记录,导致那些没有RepID=26的IdNumber(比如23J011-003、23J011-004)完全从结果中消失,不符合需求——我们需要保留这些IdNumber并设置默认值。

解决方案

通过GroupBy按IdNumber分组,确保每个IdNumber都能被处理,再对每组判断是否存在RepID=26的记录:

1. 假设你的实体类定义如下(C#)

public class Record
{
    public string IdNumber { get; set; }
    public string Amt { get; set; } // 若用数值类型可改为decimal?
    public int? RepID { get; set; }
}

2. 处理代码

var result = aList
    .GroupBy(record => record.IdNumber)
    .Select(group => 
    {
        // 查找组内RepID=26的记录
        var targetRecord = group.FirstOrDefault(r => r.RepID == 26);
        if (targetRecord != null)
        {
            return targetRecord;
        }
        // 无符合条件的记录,返回设置默认值的新对象
        return new Record
        {
            IdNumber = group.Key,
            Amt = "$0.00", // 若要和期望结果一样显示为空,可改为""
            RepID = null
        };
    })
    .ToList();

说明

  • GroupBy确保所有IdNumber都被覆盖,不会遗漏;
  • 若你的Amt是数值类型(比如decimal),直接设置Amt = 0即可;
  • 如果期望无符合条件的记录显示空值而非$0.00,将Amt赋值为""即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:35:44