检查 2 个对象是否在字段中包含相同的数据
Check if 2 objects contain the same data in fields
我有一个 Pharmacy
class,其中包含很多属性,Pharmacy
通过将 ID
属性 声明为唯一的钥匙。
我有代码可以将 table 中的所有行从 MySQL 返回到 Pharmacy
对象及其属性。
我想比较两个 List<Pharmacy>
对象中的条目,并检查两个 table 中是否存在相同的 ID
,如果不存在则将其添加到一个新的 List<Pharmacy
。如果 ID
存在于两者中但对象中的数据不同,则将该对象也保存到新的 List<Pharmacy
。
这就是 class 的样子。
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);
}
}
但是当我 运行 时,none 个对象注册为相同,即使它们在数据上相同。我该如何解决这个问题?
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 那样),这可能更可取。
我有一个 Pharmacy
class,其中包含很多属性,Pharmacy
通过将 ID
属性 声明为唯一的钥匙。
我有代码可以将 table 中的所有行从 MySQL 返回到 Pharmacy
对象及其属性。
我想比较两个 List<Pharmacy>
对象中的条目,并检查两个 table 中是否存在相同的 ID
,如果不存在则将其添加到一个新的 List<Pharmacy
。如果 ID
存在于两者中但对象中的数据不同,则将该对象也保存到新的 List<Pharmacy
。
这就是 class 的样子。
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);
}
}
但是当我 运行 时,none 个对象注册为相同,即使它们在数据上相同。我该如何解决这个问题?
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 那样),这可能更可取。