同DTO类型列表使用Except方法对比异常,Comparer为null问题求助
解决LINQ Except方法中Comparer为null及结果不符合预期的问题
首先,你看到调试时Comparer显示为null是正常现象——因为你调用的是Except的无参数重载,这个重载会默认使用EqualityComparer<T>.Default作为比较器,但调试器里可能会把这个未显式传入的参数显示为null,这并不是真正的错误根源。
真正的问题出在默认相等比较逻辑不符合你的需求:你的DTO是引用类型,默认的EqualityComparer<T>.Default会用对象引用地址来判断是否相等,而不是你期望的“属性值相同即相等”。因为本地SQLite取出的对象和服务器返回的对象是完全不同的实例(哪怕属性全一样),所以默认比较器会认为它们都是不同的,导致Except的结果可能完全不符合你的预期。
下面给你三种解决思路,按需选择:
1. 重写DTO类的Equals和GetHashCode方法
这是最直接的方式,修改你的DTO类,让它按照属性值来判断相等:
public class YourDtoClass { // 示例属性,替换成你实际的DTO字段 public int Id { get; set; } public string Title { get; set; } public override bool Equals(object obj) { // 先判断类型是否匹配 if (obj is not YourDtoClass other) return false; // 这里定义你认为两个对象相等的条件,比如用唯一标识Id,或者多个属性组合 return Id == other.Id && Title == other.Title; } public override int GetHashCode() { // 必须和Equals里的判断逻辑对应,用参与比较的属性生成哈希码 return HashCode.Combine(Id, Title); } }
2. 实现IEquatable<T>接口(更类型安全)
这是比重写Equals更规范的方式,避免了类型转换的开销:
public class YourDtoClass : IEquatable<YourDtoClass> { public int Id { get; set; } public string Title { get; set; } public bool Equals(YourDtoClass other) { if (other is null) return false; // 同样定义相等条件 return Id == other.Id && Title == other.Title; } // 重写基类的Equals,调用上面的类型安全版本 public override bool Equals(object obj) => Equals(obj as YourDtoClass); public override int GetHashCode() => HashCode.Combine(Id, Title); }
3. 创建自定义比较器(无需修改DTO类)
如果你的DTO类是第三方库提供的,或者不能修改原代码,就用这种方式:
// 先定义一个实现IEqualityComparer<T>的比较器类 public class YourDtoComparer : IEqualityComparer<YourDtoClass> { public bool Equals(YourDtoClass x, YourDtoClass y) { if (x is null && y is null) return true; if (x is null || y is null) return false; // 自定义相等判断逻辑 return x.Id == y.Id && x.Title == y.Title; } public int GetHashCode(YourDtoClass obj) { if (obj is null) return 0; return HashCode.Combine(obj.Id, obj.Title); } } // 调用Except时传入这个比较器 var notInList = localList.Except(serverList, new YourDtoComparer()).ToList();
总结一下:不管用哪种方式,核心都是告诉LINQ“怎样才算两个DTO对象相等”,这样Except才能正确找出本地有但服务器没有的对象。
内容的提问来源于stack exchange,提问作者sahithi
相关产品推荐
相关产品推荐

