gpt4 book ai didi

c# - 从 IEqualityComparer<> 派生外部类优于覆盖 GetHashCode 和 Equals 的优势

转载 作者:太空狗 更新时间:2023-10-29 22:33:44 30 4
gpt4 key购买 nike

我需要针对成员变量而不是类进行散列,所以我不检查引用是否在字典中。如果不覆盖默认值,它不会找到相同的 Value,但只有在找到完全相同的 HashedType 实例时才会返回,因此此代码失败。

Dictionary.Add(new HashedType(4));
Dictionary.Contains(new HashedType(4)); // fails to find 4

HashedType 的定义:

HashedType
{
public HashedType(Int32 value) { Value = value); }
public HashedType(String value) { Value = value); }
public object Value;
public void Serialize(Serializer s)
{
if (Value.GetType() == typeof(Int32))
{
s.Set<Int32>(0);
s.Set<Int32>(Value);
}
else
{
s.Set<Int32>(1);
s.Set<String>(Value);
}

}
}

看起来我可以覆盖 GetHashCode() 和 Equals() 来为我做这件事。

但是,MSDN 建议我创建一个从 IEqualityComparer 派生的单独类,并实例化我使用 HashedType 和 HashedTypeComparer 的字典:IEqualityComparer。

为了帮助简化这件事,我派生自 Dictionary 并创建了

HashedTypeDictionary<U> : Dictionary<T,U> 
{
public HashedTypeDictionary() : base(new HashedTypeComparer()) { }
public bool Equals(HashedType a, HashedType b) { return a.Value == b.Value; }
publci int GetHashCode(HashedType a) { return a.Value.GetHashCode(); }
}

这一切似乎都是人为的。

我得到的唯一优势是不改变 Equals() 吗?

我的意思是,说真的,无论如何我都希望 Equals 与那个成员进行比较。

最佳答案

想法是 object.Equals 是该类型的自然相等性(并且 GetHashCode 应该匹配这种相等性的想法)。 IEqualityComparer 用于根据具体情况需要不同的相等性。

例如,考虑一个string。重写的 EqualsGetHashCode 方法进行区分大小写的比较。但是如果你想要一个键不区分大小写的字典怎么办?您编写一个不区分大小写的 IEqualityComparer 并将其传递到字典的构造函数中。

你的例子听起来像 HashedType 的任何两个实例通常被视为相等,如果它们的成员相等的话。在这种情况下,我建议重写 object.Equalsobject.GetHashCode 方法,而不是编写 IEqualityComparer

关于c# - 从 IEqualityComparer<> 派生外部类优于覆盖 GetHashCode 和 Equals 的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9401071/

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