如何根据资产编号属性查找List中的重复对象?
问题:根据AssetNumber获取重复的manageMonthly对象
场景说明
- 列表定义:
List<manageMonthly> smsMngrDataMonthly = new List<manageMonthly>(); - 待处理数据:
{"BILL","321"}{"RUTH","222"}{"DAVID","321"}{"ANNA","111"}
- 对应类定义:
public class manageMonthly { public string FullNameMonthly { get; set; } public string AssetNumber { get; set; } }
需求是根据AssetNumber获取所有重复对象(即BILL和DAVID),但尝试以下Linq代码后未得到预期结果:
var duplicatesa = smsMngrDataMonthly.GroupBy(x => x.AssetNumber).Any(g => g.Count() > 1); var duplicatesb = smsMngrDataMonthly.GroupBy(x => x.AssetNumber).Where(g => g.Count() > 1);
问题分析
你写的代码存在两个核心问题:
duplicatesa是布尔值,仅用于判断「是否存在重复的AssetNumber」,并非返回重复对象;duplicatesb返回的是分组后的IGrouping<string, manageMonthly>集合,不是直接的manageMonthly对象列表,你需要展开分组才能拿到具体的重复对象。
正确解决方案
方案一:先筛选重复编号,再匹配原列表
// 第一步:找出所有出现次数>1的AssetNumber var duplicateAssetNumbers = smsMngrDataMonthly .GroupBy(x => x.AssetNumber) .Where(g => g.Count() > 1) .Select(g => g.Key); // 第二步:用重复编号筛选原列表,得到所有重复对象 var duplicateItems = smsMngrDataMonthly .Where(x => duplicateAssetNumbers.Contains(x.AssetNumber)) .ToList();
方案二:直接从分组中展开重复对象
var duplicateItems = smsMngrDataMonthly .GroupBy(x => x.AssetNumber) .Where(g => g.Count() > 1) .SelectMany(g => g) // 展开每个分组里的所有对象 .ToList();
额外检查项
- 确认
smsMngrDataMonthly已正确填充数据,不存在空对象或AssetNumber为null/空字符串的情况; - 若需要忽略
AssetNumber的大小写差异,可修改分组逻辑为x => x.AssetNumber?.ToLower()(注意处理null的情况)。
内容的提问来源于stack exchange,提问作者Damkulul
相关产品推荐
相关产品推荐

