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

如何根据资产编号属性查找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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:45:54