告诉HashSet使用IEquatable
本文关键字:IEquatable 使用 HashSet 告诉 | 更新日期: 2023-09-27 18:04:53
我在HashSet上读到的是它使用类的默认比较器。我希望下面的代码在将第二个spark添加到哈希集时失败。我认为我对正在发生的事情的理解是不完整的。来自HashSet构造函数的MSDN:
那么什么是默认的比较器,我如何告诉。net使用我自己的比较器呢?在比较集合中的值时使用的IEqualityComparer实现,或者null来使用默认的equals comparer实现。
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
。
如果您的目标是像Dictionary一样工作,禁止多次使用相同的条目并抛出异常,则必须继承HashSet和IEquatable:
class UniqueHashSet<T> : HashSet<T>, IEquatable<T>
然后,当然,写一个新的.Add()
方法来隐藏基本的Add。
但是,我相信有更好的方法。
或者,正如@Jon所说,它确实维护了一个唯一的集合。