Задать вопрос
Kamrit
@Kamrit
QA Engineer

Как правильно переопредетиль Equals?

Есть моделька:
public class CoastModel:BaseEntity
    {
        public string AppointmentCoast { get; set; }
        public double CurrencyUAH { get; set; } = 0;
        public double CurrencyUSD { get; set; } = 0;
        public double CourseOfExchange { get; set; } = 0;
        public string CategoryId { get; set; }
        public string CheckUrl { get; set; } = null;
        public DateTime Date { get; set; }
        public string AutorCoastID { get; set; }
    }

Как переопределить метод Equals, что бы сравнить все эти поля?
  • Вопрос задан
  • 263 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 3
EreminD
@EreminD
Кое-что умею
ну а в чем проблема?
public override bool Equals(System.Object obj)
    {
       // If parameter is null return false.
        if (obj == null)
        {
            return false;
        }

        // If parameter cannot be cast to CoastModel return false.
        CoastModel p = obj as CoastModel;
        if ((System.Object)p == null)
        {
            return false;
        }

        // Return true if the fields match:
        return (AppointmentCoast == p.AppointmentCoast ) && (CurrencyUAH  == p.CurrencyUAH ) && ... (AutorCoastID == p.AutorCoastID );
    }
Ответ написан
lam0x86
@lam0x86
Во-первых, не забывайте про правило Equals + GetHashCode. При переопределении Equals следует переопределять GetHashCode.

Во-вторых, переопределять Equals и GetHashCode для изменяемых типов - плохая практика. Всегда есть вероятность, что объект будет использован в HashSet'е или Dictionary, а они требуют неизменности ключа. GetHashCode в идеале должен быть стабильным, то есть всегда возвращать одинаковое значение.

В третьих (это уже моё субъективное мнение), в большинстве случаев вообще не стоит переопределять эти методы. Кроме, может быть, совсем примитивных типов вроде "строка", "комплексное число", "дата" и т.п. То есть, там, где не может быть никаких разночтений.
Объекты бизнес-логики чаще всего могут быть одновременно равны и не равны в разных контекстах сравнения. Например, где-то необходимо сравнить двух пользователей по ФИО, а в другом месте - глубокое сравнение всех полей, в т.ч. телефон и имейл. В первом случае объекты могут быть равны, а во втором различны.
В этом случае стоит написать несколько компараторов, реализовав интерфейс IEqualityComparer, и передавать нужный компаратор в нужном месте, например, в конструктор Dictionary.
Ответ написан
Комментировать
Ogoun
@Ogoun
Programmer
Использую такой вариант, после изучения вопроса сравнения объектов:

public class Sample
{
    public Guid Id;

    public bool Equals(Sample other)
    {
        if ((object)this == (object)other)
            return true;
        if (this == null)
            throw new NullReferenceException();
        if (other == null)
            return false;
        if (ReferenceEquals(this, other))
            return true;
        if (this.GetType() != other.GetType())
            return false;
        return Id == other.Id;
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Sample);
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы