我有两个相同对象的集合
public class MyClass
{
public int Id {get;set;}
public string Name {get;set;}
public int Age{get;set;}
public string SSN{get;set;}
}
我有两个基于 MyClass 的集合(colA 和 colB(,并希望以一种查找新记录、更改记录或删除记录的方式比较它们。我的出发点是
var diff = colA.Except(colB);
但这给了我错误的结果,实际上返回了整个可乐
然后我在MyClass中进行了以下更改
public Class MyClass
{
// Properties
public int Id {get;set;}
public string Name {get;set;}
public int Age{get;set;}
public string SSN{get;set;}
// Added override versions of following
public override int GetHashCode()
{
unchecked
{
return
this.Id.GetHashCode();
}
}
public override bool Equals(object obj)
{
var data = obj as MyClass;
if ( (this.Id??0).Equals(data.Id ?? 0)
&& (this.Age??0).Equals(data.Age ?? 0)
&& (this.Name??string.Empty).Equals(data.Name ?? string.Empty)
&& (this.SSN??string.Empty).Equals(data.SSN ?? string.Empty)
)
return true;
return false;
}
}
为了避免在 NULL 上失败,我在不同的字段上通过 ??应用了 NULL 合并。
我的问题是,这是最好的方法还是有更好的方法? 以及如何更改此设置以获取在字段级别上更改的内容?
我处理这个问题的方式如下:
- 实现一个
Diff
方法,该方法类似于Equals
返回当前实例和传入实例之间不同的字段列表 - 在
Equals
中使用该方法检查相等性。我可能会想实现IEquatable<MyClass>
以实现一些类型安全性,因为它使代码更清晰一些 - 使用
Except
检查新的/已删除的记录 - 使用 Linq 和我的
Diff
方法来提取两者中都存在哪些记录但有更改 - 您需要选择我认为Id
的"密钥"。
据我所知,最佳实践是在GetHashCode((和Equals(Object obj(中使用相同的相等成员。
如果使用ReSharper,您可以获得有关本手册的帮助:https://www.jetbrains.com/help/resharper/Code_Generation__Equality_Members.html