HashSet(.NET4)不会忽略c#中的重复项

Oli*_*s_j 4 c# .net-4.0 duplicates hashset

我已经读过.net4中的HashSet将忽略所有重复项.所以我做的是:

    HashSet<medbaseid> medbaseidlist = new HashSet<medbaseid>();

     for (int i = 2; i <= rowCount; i++)
     {
        medbaseid medbaseid = new medbaseid() { 
              mainClass = xlRange.Cells[i, 1].Value2.ToString(), 
              genName = xlRange.Cells[i, 2].Value2.ToString(),
              speciality = xlRange.Cells[i, 3].Value2.ToString(), 
              med_type_id = getId(xlRange.Cells[i, 4].Value2.ToString(),
              id = i-1
) 
        };

    medbaseidlist.Add(medbaseid);
 }
Run Code Online (Sandbox Code Playgroud)

medbaseid 可以具有与上一个对象相同的值.

但是如果我最后检查哈希集,则会有重复的项目. 在此输入图像描述

我添加的equals和gethashcode方法但没有帮助.我还在课堂上添加了一个id.所以2个对象可以具有相同的内容但不同的id:

   public override bool Equals(object obj)
    {
        medbaseid medb = (medbaseid)obj;
        return ((medb.id == this.id) && (medb.genName == this.genName) && (medb.mainClass == this.mainClass) && (medb.med_type_id == this.med_type_id) && (medb.speciality == this.speciality)) ? true : false;
    }

    public override int GetHashCode()
    {
        return id;
    }
Run Code Online (Sandbox Code Playgroud)

所以我现在的问题是:我做错了什么,或者这不是正确的使用方式HashSet?在此先感谢您的帮助.

Dan*_*haw 11

这将取决于的实现GetHashCode(),并Equals()medbaseid类.

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx.

默认情况下,如果对象实际上是同一个对象,则它们只会相等.拥有相同的"内容"并不足以使它们相等.如果您希望具有相同"内容"的两个不同对象相等,则必须重写Equals()以实现该逻辑.无论何时覆盖,Equals()您还必须覆盖GetHashCode()它们才能在散列数据结构中正常工作HashSet<>.

  • 还值得一提的是,散列集中的项应该是不可变的(或者至少考虑相等的字段应该是不可变的),否则它们可能在插入到散列集之后被更改,使得散列集将包含dupes. (4认同)