views:

174

answers:

1

I'm implementing IEquatable in a custom class that has a List<T> as a property, like so:

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;
    }
}

I'm concerned about the List while trying to implement the Equals and GetHashCode methods. Specifically, will List<T>.Equals evaluate the equality of it's contents? Likewise for List<T>.GetHashCode?

+6  A: 

Nope .Equals will just do a Reference comparison and GetHashCode will return the standard code allocated per object.

If you want to perform .Equals base on the content of the list you'll have to enumerate over it yourself, like wise with generating a hash code.

AnthonyWJones
Yup. Given the "weight" of the fields, make GetHashCode() fast by only using the list's Count property.
Hans Passant
@AnthonyWJones: Thanks, that's what I assumed since List doesn't seem to overload those methods from Object, but I wanted to confirm. Thanks again.
Kevin Shea