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

C# 如何依据类指定属性(含嵌套类)去除List集合中的重复元素

实现方案

方法1:GroupBy 分组实现(最简写法)

直接以A.Id和嵌套B类的sId组合作为分组键,每组取第一个元素即可实现保留首次出现条目的去重要求:

using System.Linq;

// listA 为你的原始List<A>集合
List<A> distinctList = listA
    .GroupBy(a => new { a.Id, a.b.sId })
    .Select(g => g.First())
    .ToList();

如果需要直接修改原集合,直接赋值即可:

listA = listA.GroupBy(a => new { a.Id, a.b.sId }).Select(g => g.First()).ToList();

方法2:自定义比较器搭配Distinct(适合规则复用场景)

如果多处需要用到该去重规则,可自定义IEqualityComparer<A>实现,后续直接调用Distinct方法即可:

  1. 首先定义比较器类:
public class AIdAndBIdComparer : IEqualityComparer<A>
{
    public bool Equals(A x, A y)
    {
        // 可根据业务场景调整空值判断逻辑
        if (x == null || y == null || x.b == null || y.b == null)
            return false;
        return x.Id == y.Id && x.b.sId == y.b.sId;
    }

    public int GetHashCode(A obj)
    {
        if (obj == null || obj.b == null)
            return 0;
        return HashCode.Combine(obj.Id, obj.b.sId);
    }
}
  1. 调用去重:
List<A> distinctList = listA.Distinct(new AIdAndBIdComparer()).ToList();

注意事项

  • 你原有嵌套循环的实现存在逻辑漏洞:调用RemoveAt(j)删除元素后,列表后续元素会自动前移,下一轮循环的j++会跳过被删位置后的第一个元素,可能漏删重复项。
  • 上述两种Linq实现的时间复杂度为O(n),远高于嵌套循环的O(n²),数据量大时性能优势更明显。
  • 如果业务场景中A的b属性可能为null,可自行调整空值判断逻辑避免空引用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:39:00