检查2个对象是否在字段中包含相同的数据
问题描述:
我有一个Pharmacy
类,其中包含很多属性,并且Pharmacy
通过将ID
属性作为关键字声明为唯一。检查2个对象是否在字段中包含相同的数据
我有代码将MySQL中的表中的所有行取回到Pharmacy
对象及其属性中。
我想比较两个List<Pharmacy>
对象在他们的条目,并检查是否存在两个表中同一ID
,如果它不存在,然后将其添加到一个新的List<Pharmacy
。如果两个对象中都存在ID
,但对象中的数据不同,请将该对象另存为新的List<Pharmacy
。
这是类的样子。
public class Pharmacy
{
[Key]
public string Tunniste { get; set; }
public string Lyhenne { get; set; }
public string PitkaNimi { get; set; }
public string YlempiYksikko { get; set; }
public string Hierarkiataso { get; set; }
public string VoimassaoloAlkaa { get; set; }
public string VoimassaoloPaattyy { get; set; }
...
}
这是芬兰语,但我希望你能忍受。 以下是我试图检查它们是否相同的方法。
for (int i = 0; i != pharmacyListFromArchive.Count; i++)
{
if (pharmacyListFromArchive[i].Equals(pharmacyListFromNew[i]))
{
Console.WriteLine("Objects are identical.");
}
else
{
Console.WriteLine("Objects are NOT identical. {0} - {1}", pharmacyListFromArchive[i].Tunniste, pharmacyListFromNew[i].Tunniste);
}
}
但是,当我运行它,没有任何对象注册为相同,即使它们是相同的数据。我该如何解决这个问题?
答
Equals
的标准实现仅检查引用相等性。 What is the default behavior of Equals Method?
您可以覆盖Equals
的行为。 Guidelines for Overriding Equals() and Operator == (C# Programming Guide)。
public class Pharmacy {
// fields ...
public override bool Equals(object obj) {
// If parameter is null return false.
if (obj == null) {
return false;
}
// If parameter cannot be cast to Pharmacy return false.
Pharmacy p = obj as Pharmacy;
if ((System.Object)p == null) {
return false;
}
// Return true if the fields match:
return p.Lyhenne == this.Lyhenne &&
p.PitkaNimi == this.PitkaNimi
// && etc...
;
}
public override int GetHashCode() {
return Lyhenne.GetHashCode()^PitkaNimi.GetHashCode() /*^etc ... */;
}
}
或者您执行自定义IEqualityComparer
IEqualityComparer Interface。如果你的ORM Mapper依赖于默认的equals(比如Entity Framework),这可能会更好。
你必须重写'Equals'来比较ID属性,否则只有引用被比较 –
序列化这两个对象并比较结果字符串,可能是一个选项? – bartbje