Указание HashSet использовать IEquatable?

Что я прочитал о HashSet, так это то, что он использует компаратор по умолчанию для класса. Я ожидаю, что приведенный ниже код не сработает при добавлении второго Spork в хеш-набор. Думаю, мое понимание происходящего неполное. Из MSDN конструктора HashSet:

Реализация IEqualityComparer для использования при сравнении значений в наборе или null, чтобы использовать реализацию EqualityComparer по умолчанию для типа набора.

Итак, что является компаратором по умолчанию и как я могу определить .Net использовать мой собственный компаратор?

public class Spork : IEquatable<Spork>
{
    public int Id { get; set; }


    public bool Equals(Spork other)
    {
        return other != null && other.Id == this.Id;
    }

    public override bool Equals(object obj)
    {
        var other = obj as Spork;
        return other != null && other.Id == this.Id;
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

public class Bjork
{
    public static HashSet<Spork> Sporks { get; set; }
    public static void Main()
    {
        Sporks = new HashSet<Spork>();
        Sporks.Add(new Spork() { Id = 0 });
        Sporks.Add(new Spork() { Id = 0 });     // come on, please throw an exception
    }
}
9
задан Amy 9 August 2011 в 22:29
поделиться