合并两个List<DealResponse>列表并去除重复项的实现方案
嘿,针对你这个合并两个DealResponse列表并去重的需求,我给你两种实用的实现方案,你可以根据项目的.NET版本来选就行~
首先得明确:咱们判断两个DealResponse对象是不是重复,应该是看detailId和detailcd的字段组合吧?毕竟你给出的示例里,L1和L2都有detailId=5且detailcd=ABC的项,这肯定是要去重的重复项。
方法1:用
DistinctBy(.NET 6+ 推荐) 这个方法最简洁,不用修改你的DealResponse类,直接通过指定去重的键来实现:
先把两个列表拼接,再用DistinctBy指定判断重复的字段组合:
// 合并L1和L2,再按detailId+detailcd去重 var combinedList = L1.Concat(L2) .DistinctBy(item => new { item.detailId, item.detailcd }) .ToList();
解释:Concat负责把两个列表拼接成一个,DistinctBy会根据你传入的匿名类型(包含detailId和detailcd)筛选唯一项,最后转成List。这个方法在.NET 6及以后的版本支持,省心又高效。
方法2:实现
IEquatable<T>接口(兼容旧.NET版本) 如果你的项目用的是.NET 5或更早版本,没有DistinctBy,那可以给DealResponse类实现IEquatable<T>接口,让系统明确知道怎么判断两个对象是否相等:
首先修改DealResponse类:
public class DealResponse : IEquatable<DealResponse> { public string detailId { get; set; } public string detailcd { get; set; } public string fileName { get; set; } public string isNgo { get; set; } // 定义相等规则:detailId和detailcd都相等时,视为同一对象 public bool Equals(DealResponse other) { if (other == null) return false; return detailId == other.detailId && detailcd == other.detailcd; } // 重写基类的Equals方法,保持逻辑一致 public override bool Equals(object obj) { return Equals(obj as DealResponse); } // 重写GetHashCode,保证相等的对象哈希码一致 public override int GetHashCode() { return HashCode.Combine(detailId, detailcd); } // 可选:重载==和!=运算符,让代码判断相等更直观 public static bool operator ==(DealResponse left, DealResponse right) { return EqualityComparer<DealResponse>.Default.Equals(left, right); } public static bool operator !=(DealResponse left, DealResponse right) { return !(left == right); } }
之后就可以用Union方法合并去重了:
var combinedList = L1.Union(L2).ToList();
解释:Union方法会自动调用我们实现的Equals方法判断重复,只保留唯一的项。
补充说明
如果你的“重复”定义不是detailId+detailcd,而是其他字段组合,只需要修改对应的部分就行:比如DistinctBy里的匿名类型字段,或者Equals方法里的判断逻辑。
内容的提问来源于stack exchange,提问作者Ami
相关产品推荐
相关产品推荐

