问题描述
我有两个具有相同类型和值的对象 我如何按价值比较它们?
经验:
class Person
{
public string Name { get; set; }
public DateTime BirthDate { get; set; }
public Address Address { get; set; }
}
class Address
{
public string City { get; set; }
public int ZipCode { get; set; }
}
var p1 = new Person()
{
Name = "John doe",BirthDate = new DateTime(2000,1,1),Address = new Address(){
City = "some city",ZipCode = 123456
}
};
var p2 = new Person()
{
Name = "John doe",Address = new Address(){
City = "some city",ZipCode = 123456
}
};
那么如何将这些对象与值进行比较?
Mabey 将来我想更改我的对象,所以我需要一种不依赖于对象属性名称和类型的通用方法
解决方法
使用json
将每个对象转换为json字符串,所有属性/字段按名称排序,然后比较两个字符串。这很慢,但有效。
使用反射
使用反射方法,将每个属性/字段一一比较。实际上 json 库做同样的工作。自己进行比较将节省转换为字符串的时间,但您必须深入研究嵌套类型。
使用一些代码生成器,例如protobuf
如果数据类型只是 POCO 类型,也许 protobuf 是一个不错的选择。它引入了很多优点:
- 内置比较
- json 序列化和反序列化
- 非常快速的二进制序列化和反序列化
- 跨平台、跨语言,与grpc进程间通信很好地集成
- 版本兼容性,添加新字段后,应用仍可读取磁盘上的旧数据。
只需在你的 Person 类中创建一个“相等的函数”
public bool class Equals(Person source)
{
if(this.Name!=source.Name) return false;
if(this.Surname!=source.Surname)return false;
....
return true;
}
然后像这样使用:
if(myFirstPerson.Equals(mySecondPerson))
{
}
像这样你可以放置任意多的属性,然后甚至创建几个Equals
函数,如果你不需要总是比较相同的属性。我个人总是用这种方式(而不是“如果值相等”,我把“如果值不相等则返回false”),当你有很多要比较的值和不同的相等函数时非常有用。