.net 3.5 Список <T>Равенство и GetHashCode - PullRequest
4 голосов
/ 15 января 2010

Я реализую IEquatable в пользовательском классе, который имеет список <T> в качестве свойства, например:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<string> Dislikes;

    public bool Equals(Person p)
    {
        if (p == null)
        {
            return false;
        }
        if (object.ReferenceEquals(this, p))
        {
            return true;
        }

        return this.FirstName == p.FirstName 
            && this.LastName == p.LastName
            && this.Dislikes == p.Dislikes; //or this.Dislikes.Equals(p.Dislikes)
    }

    public override int GetHashCode()
    {
        int hash = 17;
        hash = hash * 23 + (this.FirstName ?? String.Empty).GetHashCode();
        hash = hash * 23 + (this.LastName ?? String.Empty).GetHashCode();
        hash = hash * 23 + this.Dislikes.GetHashCode();
        return hash;
    }
}

Меня беспокоит Список, когда я пытаюсь реализовать методы Equals и GetHashCode. В частности, будет ли List <T> .Equals оценивать равенство его содержимого? Аналогично для списка <T> .GetHashCode?

1 Ответ

11 голосов
/ 15 января 2010

Нет. Эквалайзеры просто выполнят сравнение ссылок, а GetHashCode вернет стандартный код, выделенный для объекта.

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

...