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

如何合并两个DTOVariance列表并排除EditedValue相等的项?

解决LINQ中object类型值相等判断失效的问题

问题原因

你的EditedValue是object?类型,直接用!=判断会出现以下问题:

  • 存储值类型(如int、DateTime等)时,值会被装箱为Object实例,!=比较的是两个装箱对象的引用地址,而非实际值是否相等。例如两个值为5的int,装箱后是不同的Object实例,!=会返回true,但实际值是相等的,导致筛选条件失效。
  • 对于未重写Equals方法的引用类型,!=同样只会比较引用地址,而非对象内容是否相等,也会导致判断错误。

解决方案

使用object.Equals()静态方法进行相等性判断,它会自动处理所有场景:

  1. 两个值均为null时返回true
  2. 一个为null另一个非null时返回false
  3. 对于装箱的值类型,自动拆箱后比较实际值
  4. 对于引用类型,调用该类型重写的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:33:17