gpt4 book ai didi

c# - 比较实体

转载 作者:太空宇宙 更新时间:2023-11-03 23:16:47 24 4
gpt4 key购买 nike

我有一个我构建的实体,我采用了一个实例化实体和一个修改后的实体。这允许我保存初始数据,以与修改后的数据进行比较。问题是什么是理想的方法?我应该将 IEquatable 实现为 Object.Equals 的覆盖还是实现 ICompare?我最初的实现是:

var properties = typeof(TEntity).GetProperties();
foreach(var property in properties)
{
var initialEntity = original.GetType().GetProperty(property.Name).GetValue(original, null);
var modifiedEntity = userChange.GetType().GetProperty(property.Name).GetValue(userChange, null);

if(initialEntity.Equals(modifiedEntity) == false && !ignore.Contains(property.Name))
{
// Do Something
}
}

我的理解是它会返回一个 boolean,同样在这个例子中它会根据 Value Equality 进行比较,我假设它是基于引用相等性进行比较.

因为它从不区分,所以在任何情况下它都是平等的。

最佳答案

最简单的答案:

  • 如果你需要测试相等性,实现IEquatable<T> 并覆盖 Equals()GetHashCode()
  • 如果您需要对对象进行排序,请执行 IComparable<T>

Object.Equals() 的默认实现确定一个对象使用的内存位置是否与另一个对象相同。这本质上就是Object.ReferenceEquals(obj1, obj2)确实如此,但是 dot net 需要您告诉它如何确定您创建的两个对象是否相同。

此外,Object.GetHashCode() 的默认实现是对象在内存中所在位置的 32 位地址(或地址的一部分)。除非您重写它以生成哈希码,该哈希码是您在 Equals() 中比较的所有内容的函数。方法,当您尝试将其存储在哈希集中或将其用作字典键时,您会得到意想不到的结果。

您可能需要同时实现两者,但在您的情况下看起来像 IEquatable<T>是最紧迫的需求。

关于c# - 比较实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37010632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com