在 C# 中比较同一对象的两个集合和查找新的、更改的或删除的记录



我有两个相同对象的集合

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

最新更新