Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 告诉HashSet使用IEquatable?_C#_.net - Fatal编程技术网

C# 告诉HashSet使用IEquatable?

C# 告诉HashSet使用IEquatable?,c#,.net,C#,.net,我在HashSet上读到的是,它使用类的默认比较器。我希望下面的代码在将第二个Spork添加到哈希集时失败。我认为我对正在发生的事情的理解是不完整的。从哈希集构造函数的MSDN: 比较集合中的值时要使用的IEqualityComparer实现,或为null以使用集合类型的默认EqualityComparer实现 那么什么是默认比较器,我如何告诉.Net使用我自己的比较器呢 public class Spork : IEquatable<Spork> { public int

我在HashSet上读到的是,它使用类的默认比较器。我希望下面的代码在将第二个Spork添加到哈希集时失败。我认为我对正在发生的事情的理解是不完整的。从哈希集构造函数的MSDN:

比较集合中的值时要使用的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
    }
}
公共类Spork:IEquatable
{
公共int Id{get;set;}
公共布尔等于(其他)
{
返回other!=null&&other.Id==this.Id;
}
公共覆盖布尔等于(对象对象对象)
{
var other=obj作为Spork;
返回other!=null&&other.Id==this.Id;
}
公共覆盖int GetHashCode()
{
返回Id.GetHashCode();
}
}
公共类比约克
{
公共静态哈希集{get;set;}
公共静态void Main()
{
Sporks=newhashset();
Add(new Spork(){Id=0});
Add(new Spork(){Id=0});//来吧,请抛出一个异常
}
}
它正在使用您的相等方法-但在尝试添加相等值时不会引发异常-它只返回false


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

,如果您的目标是像字典一样工作,多次禁止同一条目并引发异常,则必须从HashSet和IEquatable继承:

class UniqueHashSet<T> : HashSet<T>, IEquatable<T>  
class UniqueHashSet:HashSet,IEquatable
当然,然后编写一个新的
.Add()
方法来隐藏基本Add

但是,我相信有更好的办法


或者,正如@Jon所说,它确实保存了一个独特的收藏。

@Inuyasha:没必要-我们以前都没有读过文档:)这本书似乎没有提到IEquatable。我遗漏了什么吗?通过在上挖掘引用源,我得出了相同的结论,默认比较器检查元素类型,如果它实现了IEquatable,它似乎“以某种方式”使用它。@KFL:文档说,如果没有指定,构造函数使用默认的相等比较器。然后查看文档以获取更多信息