如何比较两个引用类型嵌套对象和动态对象的值
how to compare values of two reference type nested and dynamic objects
我有两个具有相同类型和值的对象
我如何按价值比较它们?
exp:
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",
BirthDate = new DateTime(2000, 1, 1),
Address = new Address(){
City = "some city",
ZipCode = 123456
}
};
那么如何比较这些对象的价值?
也许将来我想更改我的对象,所以我需要一种不依赖于对象属性名称和类型的通用方法
只需在你的 Person 中创建一个“Equal 函数”class
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
函数。就我个人而言,我总是使用这种方式(而不是“如果值相等”,我使用“如果值不等于则 return false”),当你有很多值要比较时非常有用,并且有不同的相等函数。
使用json
将每个对象转换成一个json字符串,所有properties/fields按名称排序,然后比较两个字符串。这很慢,但它有效。
使用反射
使用反射的方法,将每个property/field一一比较。实际上 json 库做同样的工作。自己进行比较会节省转换为字符串的时间,但您必须深入研究嵌套类型。
使用一些代码生成器,例如protobuf
如果数据类型只是POCO类型,也许protobuf是个不错的选择。它介绍了很多优点:
- 内置比较
- json序列化和反序列化
- 非常快的二进制序列化和反序列化
- 跨平台跨语言,与grpc进程间通信集成良好
- 版本兼容性,添加新字段时,应用程序仍可读取磁盘上的旧数据。
我有两个具有相同类型和值的对象 我如何按价值比较它们?
exp:
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",
BirthDate = new DateTime(2000, 1, 1),
Address = new Address(){
City = "some city",
ZipCode = 123456
}
};
那么如何比较这些对象的价值?
也许将来我想更改我的对象,所以我需要一种不依赖于对象属性名称和类型的通用方法
只需在你的 Person 中创建一个“Equal 函数”class
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
函数。就我个人而言,我总是使用这种方式(而不是“如果值相等”,我使用“如果值不等于则 return false”),当你有很多值要比较时非常有用,并且有不同的相等函数。
使用json
将每个对象转换成一个json字符串,所有properties/fields按名称排序,然后比较两个字符串。这很慢,但它有效。
使用反射
使用反射的方法,将每个property/field一一比较。实际上 json 库做同样的工作。自己进行比较会节省转换为字符串的时间,但您必须深入研究嵌套类型。
使用一些代码生成器,例如protobuf
如果数据类型只是POCO类型,也许protobuf是个不错的选择。它介绍了很多优点:
- 内置比较
- json序列化和反序列化
- 非常快的二进制序列化和反序列化
- 跨平台跨语言,与grpc进程间通信集成良好
- 版本兼容性,添加新字段时,应用程序仍可读取磁盘上的旧数据。