У меня есть два объекта с одинаковым типом и значениями как я могу сравнить их по стоимости?
эксп:
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
}
};
так как я могу сравнить эти объекты со значением?
Может быть, в будущем я хочу изменить свои объекты, поэтому мне нужен общий способ, который не зависит от имен и типов свойств объекта.
IEquatable<T> великолепен, когда я не буду менять свой класс в будущем
Вы можете сделать это с отражением: получить все свойства и проверить их. Таким образом, вы можете делать то, что хотите, например, перебирать полное дерево классов (свойство типа класса, например Address) и, при необходимости, вы можете создать свой собственный атрибут для исключения некоторых свойств из проверки.
Отвечает ли это на ваш вопрос? Как быстро проверить, имеют ли два объекта передачи данных одинаковые свойства в C#?
просто сделайте "Равную функцию" в вашем классе 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»), потому что это очень полезно, когда у вас есть много значений для сравнения и разные функции равенства.
Преобразуйте каждый объект в строку json со всеми свойствами/полями, отсортированными по имени, а затем сравните две строки. это медленно, но работает.
Используя методы отражения, сравните каждое свойство/поле по одному. На самом деле библиотека json выполняет ту же работу. Самостоятельное сравнение сэкономит время на преобразование в строку, но вам придется погрузиться во вложенные типы.
Если тип данных просто тип POCO, возможно, хорошим выбором будет protobuf. Это дает много преимуществ:
спасибо, золотой бык, я пробовал отражение и JSON, как вы говорите... оба они работают правильно, но использование отражения выполняется за более короткое время.
Я знаю, что могу преобразовать свой объект в JSON и сравнить их... Я хочу знать, есть ли лучший способ?