可能我错过了使用 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
}
最佳答案
首先,您覆盖 GetHashCode
但没有覆盖 Equals
。不要那样做。它们应该始终以一致的方式同时被覆盖。
接下来,更改对象哈希码会影响在任何基于哈希的数据结构中找到它是正确的。毕竟,在基于散列的结构中检查键是否存在的第一部分是通过快速查找具有相同散列代码的所有现有条目来查找候选相等值。数据结构无法“知道”哈希码已更改并更新其自己的表示。
documentation 清楚地说明了这一点:
关于c# - HashSet 不会删除对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26032908/