我在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.