如何使用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
相关产品推荐
相关产品推荐

