如何合并两个DTOVariance列表并排除EditedValue相等的项?
解决LINQ中object类型值相等判断失效的问题
问题原因
你的EditedValue是object?类型,直接用!=判断会出现以下问题:
- 存储值类型(如int、DateTime等)时,值会被装箱为Object实例,
!=比较的是两个装箱对象的引用地址,而非实际值是否相等。例如两个值为5的int,装箱后是不同的Object实例,!=会返回true,但实际值是相等的,导致筛选条件失效。 - 对于未重写
Equals方法的引用类型,!=同样只会比较引用地址,而非对象内容是否相等,也会导致判断错误。
解决方案
使用object.Equals()静态方法进行相等性判断,它会自动处理所有场景:
- 两个值均为null时返回true
- 一个为null另一个非null时返回false
- 对于装箱的值类型,自动拆箱后比较实际值
- 对于引用类型,调用该类型重写的
Equals方法(如果有)比较内容
修改后的LINQ查询代码:
var validVariances = (from dbv in dbVariances join editedv in editedVariances on dbv.PropertyName equals editedv.PropertyName where !object.Equals(dbv.EditedValue, editedv.EditedValue) select new DTOVariance { PropertyName = dbv.PropertyName, OriginalValue = dbv.OriginalValue, EditedValue = editedv.EditedValue }).ToList();
补充说明
如果明确知道EditedValue的具体类型(比如都是string或int),也可以先强制转型后再比较,示例如下:
// 假设EditedValue都是string类型 where (string)dbv.EditedValue != (string)editedv.EditedValue
但这种方式通用性差,若存在多种类型时,优先推荐使用object.Equals的方案。
内容的提问来源于stack exchange,提问作者Hank
相关产品推荐
相关产品推荐

