Постоянное значение false у list.Contains - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, помогите пожалуйста разобраться из за чего постоянно значение false у строчки "da.Contains(new data { FIO = comboBox1.SelectedValue.ToString(), data1 = dateTimePicker1.Value.ToString() })". Это значение постоянно даже если в list da есть точно такая же запись.
public class data
        {
            public string FIO { get; set; }
            public string klass { get; set; }
            public string data1 { get; set; }
            public override string ToString()
            {
                return "ФИО: " + FIO + " Специализация: " + klass+" Дата ухода в отпуск: "+data1;
            }
        }
private void button3_Click(object sender, EventArgs e)
        {            
               if (da.Contains(new data { FIO = comboBox1.SelectedValue.ToString(), data1 = dateTimePicker1.Value.ToString() })==true) 
                MessageBox.Show("Не может уйти в отпуск т.к. человек с такой же специализацией уходит в эту же дату");
            else
                da.Add(new data { FIO = comboBox1.SelectedValue.ToString(), klass = comboBox2.SelectedValue.ToString(), data1 = dateTimePicker1.Value.ToString() });
            
        }

Решение задачи: «Постоянное значение false у list.Contains»

textual
Листинг программы
public class data
{
    public string FIO { get; set; }
    public string klass { get; set; }
    public string data1 { get; set; }
    public override string ToString()
    {
        return "ФИО: " + FIO + " Специализация: " + klass+" Дата ухода в отпуск: "+data1;
    }
 
    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }
        if (ReferenceEquals(this, obj))
        {
            return true;
        }
        return obj.GetType() == GetType() && Equals((data)obj);
    }
 
    public bool Equals(data other)
    {
        return string.Equals(klass, other.klass) && string.Equals(data1, other.data1);
    }
 
    public override int GetHashCode()
    {
        unchecked
        {
            return ((klass?.GetHashCode() ?? 0) * 397) ^ (data1?.GetHashCode() ?? 0);
        }
    }
}

Оцени полезность:

9   голосов , оценка 4 из 5