如何不使用循环语句基于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
相关产品推荐
相关产品推荐

