c# – 告诉HashSet使用IEquatable?

前端之家收集整理的这篇文章主要介绍了c# – 告诉HashSet使用IEquatable?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在HashSet上读到的是使用一个类的默认比较器.我希望下面的代码失败,添加第二个Spork到哈希集.我认为我对发生的事情的理解是不完整的.从MSDN的HashSet构造函数

The IEqualityComparer implementation to use when comparing values in the set,or null to use the default EqualityComparer implementation for the set type.

那么什么是默认的比较器,我怎么能告诉.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
    }
}

解决方法

它正在使用您的等式方法 – 但是当您尝试添加相等的值时,HashSet<T>.Add不会抛出异常 – 它只返回false.

如果您更改最后两行以打印出Add的返回值,那么您将首次看到它返回True,然后返回False.

猜你在找的C#相关文章