首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >告诉HashSet使用IEquatable?

告诉HashSet使用IEquatable?
EN

Stack Overflow用户
提问于 2011-08-09 22:29:01
回答 2查看 4.1K关注 0票数 9

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

在比较集合中的值时要使用的IEqualityComparer实现,或者null用于对set类型使用默认的EqualityComparer实现。

那么,默认的比较器是什么,我如何告诉.Net使用我自己的比较器?

代码语言:javascript
复制
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
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-09 22:33:45

它使用的是相等的方法--但是当您试图添加相同的值时,HashSet.Add不会抛出异常--它只是返回false。

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

票数 22
EN

Stack Overflow用户

发布于 2011-08-09 22:37:08

如果您的目标是像字典一样工作,多次不允许相同的条目并抛出异常,那么您必须继承HashSet和IEquatable:

代码语言:javascript
复制
class UniqueHashSet<T> : HashSet<T>, IEquatable<T>  

然后,当然,编写一个新的.Add()方法来隐藏基本添加。

但是,我相信还有更好的方法。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7003825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档