提问人:Tatu 提问时间:10/13/2017 更新时间:10/13/2017 访问量:986
检查 2 个对象在字段中是否包含相同的数据
Check if 2 objects contain the same data in fields
问:
我有一个包含许多属性的类,并且通过将属性作为键来声明唯一属性。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);
}
}
但是当我运行它时,即使它们在数据上相同,也没有一个对象注册为相同。我该如何解决这个问题?
答:
4赞
Georg Patscheider
10/13/2017
#1
检查的标准实现仅针对引用相等性。Equals Method 的默认行为是什么?Equals
您可以覆盖 的行为。重写 equals() 和运算符 == 的准则(C# 编程指南)。Equals
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 接口。如果 ORM 映射器依赖于默认的等于值(如实体框架),则这可能更可取。IEqualityComparer
评论
Equals