Не срабатывает Equals

192
13 апреля 2017, 15:29

Данное условие почему-то возвращает false, не сравнивается ни с помощью equals, ни с помощью ==. Как следствие, неправильно работает linq. Условие срабатывает, если сравнивать соответствующие поля.

Product p1 = new Product("2", 2, 2, 2, default(DateTime));
Product p2 = new Product("2", 2, 2, 2, default(DateTime));
if (p1.Equals(p2))
{
     Debug.WriteLine("p1 eq p2");
}

Сам класс:

public class Product
{
    public Product(string name, double price, int count, double total, DateTime date)
    {
        if (name == string.Empty || price < 0 || count < 0 || total < 0 || date > DateTime.Now)
        {
            MessageBox.Show("Неверные параметры");
            return;
        }
        this.Name = name;
        this.Price = price;
        this.Count = count;
        this.Total = total;
        this.Date = date;
    }
    public string Name { get; set; }
    public double Price { get; set; } 
    public int Count { get; set; }
    public double Total { get; set; }
    public DateTime Date { get; set; }
}
Answer 1

Набросал:

public class Product
{
    public Product(string name, double price, int count, double total, DateTime date)
    {
        if (name == string.Empty || price < 0 || count < 0 || total < 0 || date > DateTime.Now)
        {
            Console.WriteLine("неверные параметры");
            return;
        }
        this.Name = name;
        this.Price = price;
        this.Count = count;
        this.Total = total;
        this.Date = date;
    }
    public string Name { get; set; }
    public double Price { get; set; }
    public int Count { get; set; }
    public double Total { get; set; }
    public DateTime Date { get; set; }
    public override bool Equals(object obj)
    {
        if (obj == null || this.GetType() != obj.GetType())
            return false;
        Product p = (Product)obj;
        return (Name == p.Name) && (Price == p.Price) && (Count == p.Count) && (Total == p.Total) && (Date == p.Date);            
    }
    public override int GetHashCode()
    {
        return (int)Price ^ (int)Total ^ Count;
    }
}

правда метод GetHashCode реализует лишь числовые поля, кроме строки и даты. Но вы уже сами можете перекрутить их как вам угодно.

READ ALSO
Chart C# Заменить числа на Ох (1,2,3&hellip;) на (Pi/2,Pi,&hellip;)

Chart C# Заменить числа на Ох (1,2,3…) на (Pi/2,Pi,…)

Сам интервал мы меняем chart1ChartAreas[0]

213
Не могу понять код

Не могу понять код

Страница 50 книги "C# для начинающих" Мартина ДрейераВ код необходимо добавить метод

179
Для поставщика ADO.NET с неизменяемым именем &ldquo;Oracle.ManagedDataAccess.Client&rdquo;

Для поставщика ADO.NET с неизменяемым именем “Oracle.ManagedDataAccess.Client”

Доброго, столкнулся с ошибкой: Для поставщика ADONET с неизменяемым именем "Oracle

213
Проблемы со сборкой проекта MonoDevelop на Ubuntu

Проблемы со сборкой проекта MonoDevelop на Ubuntu

Пытаюсь собрать проект на линуксе, написанном на C#, компилятор ругается на ошибку: /usr/lib/mono/45/Microsoft

246