HashSet不会删除对象

Nac*_*cho 3 c# hashset

可能我会错过使用HashSet和HashCode的东西,但我不知道为什么这不能像我想的那样工作.我有一个覆盖HashCode的对象.我将对象添加到HashSet,然后我更改了一个属性(用于计算HashCode),然后我无法删除该对象.

public class Test 
{
    public string Code { get; set; }
    public override int GetHashCode()
    {
        return (Code==null)?0: Code.GetHashCode();
    }
}

public void TestFunction()
{
    var test = new Test();
    System.Collections.Generic.HashSet<Test> hashSet = new System.Collections.Generic.HashSet<Test>();
    hashSet.Add(test);
    test.Code = "Change";

    hashSet.Remove(test);  //this doesn´t remove from the hashset
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

首先,你是压倒一切GetHashCode但不是压倒一切Equals.不要那样做.它们应始终以一致的方式同时被覆盖.

接下来,您是正确的,更改对象哈希代码影响在任何基于哈希的数据结构中找到它.毕竟,检查基于散列的结构中是否存在密钥的第一部分是通过快速查找具有相同散列码的所有现有条目来找到候选相等的值.数据结构无法"知道"哈希代码已被更改并更新其自己的表示.

文件说明了这一点:

您可以覆盖GetHashCode不可变引用类型.通常,对于可变引用类型,GetHashCode只应在以下情况下覆盖:

  • 您可以从不可变的字段计算哈希码; 要么
  • 您可以确保在对象包含在依赖于其哈希代码的集合中时,可变对象的哈希码不会更改.