gpt4 book ai didi

c# - HashSet 不删除对象

转载 作者:行者123 更新时间:2023-11-30 13:45:51 25 4
gpt4 key购买 nike

可能我错过了一些使用 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明确这一点:

You can override GetHashCode for immutable reference types. In general, for mutable reference types, you should override GetHashCode only if:

  • You can compute the hash code from fields that are not mutable; or
  • You can ensure that the hash code of a mutable object does not change while the object is contained in a collection that relies on its hash code.

关于c# - HashSet 不删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26032908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com