我有一个包含许多属性的Pharmacy
类,并且Pharmacy
属性作为键被声明为唯一。ID
我有代码将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);
}
}
但是当我运行它时,即使数据相同,也没有任何对象注册为相同。我该如何解决这个问题?
答案 0 :(得分:4)
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那样),那么这可能更好。