首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HashSet允许重复项目插入- C#

HashSet允许重复项目插入- C#
EN

Stack Overflow用户
提问于 2012-01-06 02:15:31
回答 7查看 41.2K关注 0票数 45

这似乎是一个菜鸟问题,但我找不到一个具体的答案。

我有这样一门课:

代码语言:javascript
复制
public class Quotes{ 
    public string symbol; 
    public string extension
}

我用的是这个:

代码语言:javascript
复制
HashSet<Quotes> values = new HashSet<Quotes>();

但是,我可以多次添加相同的报价对象。例如,我的Quotes对象可能具有等于'A‘的'symbol’和等于'=n‘的'extension’,并且此Quotes对象在HashSet中多次出现(通过调试模式查看哈希集)。我在打电话的时候就想过

代码语言:javascript
复制
values.Add(new Quotes(symb, ext));

使用相同的symb和ext,将返回'false‘,并且不会添加元素。我有一种感觉,当HashSet添加一个新对象时,它与比较Quotes对象有关。任何帮助都将不胜感激!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-01-06 02:22:57

我猜您正在创建一个具有相同值的新Quotes。在这种情况下,它们是不相等的。如果它们应该被视为相等,则重写Equals和GetHashCode方法。

代码语言:javascript
复制
public class Quotes{ 
    public string symbol; 
    public string extension

    public override bool Equals(object obj)
    {
        Quotes q = obj as Quotes;
        return q != null && q.symbol == this.symbol && q.extension == this.Extension;
    }

    public override int GetHashCode()
    {
        return this.symbol.GetHashCode() ^ this.extension.GetHashCode();
    }
}
票数 64
EN

Stack Overflow用户

发布于 2012-01-06 02:19:12

我曾想过,当使用相同的符号和ext调用values.Add(new Quotes(symb, ext));时,会返回'false‘,并且不会添加元素。

事实并非如此。

HashSet将使用GetHashCodeEquals来确定对象的相等性。现在,因为你没有覆盖Quotes中的这些方法,所以将使用默认的System.Object的引用相等。每次你添加一个新的Quote,它都是一个唯一的对象实例,所以HashSet会把它看作一个唯一的对象。

如果您覆盖Object.EqualsObject.GetHashCode,它将按照您的预期工作。

票数 20
EN

Stack Overflow用户

发布于 2012-01-06 02:19:43

HashSets首先根据GetHashCode计算出的散列比较条目。

默认实现根据对象本身返回一个哈希码(每个实例不同)。

只有当散列相同时(对于基于实例的散列来说,这是非常不可能的),Equals方法才会被调用并用于明确地比较两个对象。

你必须选择:

  • 将Quotes更改为struct
  • Override Quotes,并在Quotes

中使用Equals

示例:

代码语言:javascript
复制
 public override int GetHashCode()
 {
    return (this.symbol == null ? 0 : this.symbol.GetHashCode())
       ^ (this.extension == null ? 0 : this.extension.GetHashCode());
 }
 public override bool Equals(object obj)
 {
    if (Object.ReferenceEquals(this, obj))
      return true;

    Quotes other = obj as Quotes;
    if (Object.ReferenceEquals(other, null))
      return false;

    return String.Equals(obj.symbol, this.symbol)
        && String.Equals(obj.extension, this.extension);
 }
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8747577

复制
相关文章

相似问题

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