gpt4 book ai didi

c# - 在 C# 中散列数组

转载 作者:可可西里 更新时间:2023-11-01 07:56:26 26 4
gpt4 key购买 nike

简短的问题

如何为 Array 实现 GetHashCode

详情

我有一个覆盖 Equals 的对象,检查:

this.array[n] == otherObject.array[n]

对于 array 中的所有 n

自然地,我应该实现互补的 GetHashCode。我想知道是否有 .NET 方法可以做到这一点,或者我是否应该实现自己的方法,比如

hash = hash ^ array[n]

澄清

我的对象包含一个数组,我对数组元素的 GetHashCode 很感兴趣。我的数组等效代码仅作为示例 - 就像我的问题所说,但也许我不清楚,我对 GetHashCode(而不是 Equals)感兴趣。我说我自然应该实现互补的 GetHashCode,因为一旦 Equals 被覆盖(对于 Dictionary 等),.NET 就需要实现它。才能正常工作)。谢谢。

最佳答案

要使用数组的元素计算哈希码,您可以将数组转换为 IStructuralEquatable然后调用GetHashCode(IEqualityComparer)方法,传递数组中元素类型的比较器。

(强制转换是必要的,因为 Array 类显式地实现了该方法。)

例如,如果您的对象有一个 int 数组,那么您可以像这样实现 GetHashCode:

public override int GetHashCode()
{
return ((IStructuralEquatable)this.array).GetHashCode(EqualityComparer<int>.Default);
}

如果您感到好奇,下面是 Array 类如何实现 GetHashCode 方法(来自 Reference Source ):

internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}

int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
if (comparer == null)
throw new ArgumentNullException("comparer");
Contract.EndContractBlock();

int ret = 0;

for (int i = (this.Length >= 8 ? this.Length - 8 : 0); i < this.Length; i++) {
ret = CombineHashCodes(ret, comparer.GetHashCode(GetValue(i)));
}

return ret;
}

如您所见,当前实现仅使用数组的最后八个元素。

关于c# - 在 C# 中散列数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37118089/

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