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

如何不使用循环语句基于ID属性移除对象列表中的重复项?

基于ID移除对象列表重复项的解决方案

问题分析

你写的代码list.GroupBy(x => x.Id).Select(d => d.Distinct()).ToList()无效的原因有两个:

  • 每个分组内的对象如果是引用类型,默认的Distinct()会按对象引用判断是否重复,而非属性值,所以即使两个对象Id和其他属性都一致,也会被视为不同实例,Distinct()起不到去重作用。
  • 最终返回的是List<IEnumerable<YourItemType>>类型(分组后的集合),而非你需要的去重后的单个对象列表。

解决方法

根据你的.NET版本,选择以下任意一种方法即可:

方法一:GroupBy后取每组第一个元素(兼容所有.NET版本)

按Id分组后,每个分组内的元素Id都相同,直接取每组的第一个元素就能得到去重后的列表:

list.GroupBy(x => x.Id).Select(g => g.First()).ToList();

方法二:使用DistinctBy(.NET 6及以上版本推荐)

.NET 6新增了DistinctBy方法,可以直接指定按Id属性去重,代码更简洁:

list.DistinctBy(x => x.Id).ToList();

方法三:自定义相等比较器(.NET 5及以下版本)

如果你的项目用的是.NET 5或更早版本,没有DistinctBy,可以自定义一个IEqualityComparer来让Distinct()按Id判断重复:

// 先定义你的对象类型,假设名为QuestionAnswer
public class QuestionAnswer
{
    public int Id { get; set; }
    public string Question { get; set; }
    public string Answer { get; set; }
}

// 自定义比较器
public class QuestionAnswerEqualityComparer : IEqualityComparer<QuestionAnswer>
{
    public bool Equals(QuestionAnswer x, QuestionAnswer y)
    {
        if (x == null || y == null) return false;
        return x.Id == y.Id;
    }

    public int GetHashCode(QuestionAnswer obj)
    {
        return obj.Id.GetHashCode();
    }
}

// 调用去重
var distinctList = list.Distinct(new QuestionAnswerEqualityComparer()).ToList();

以上三种方法都能得到你期望的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:42:31