作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
简短的问题
如何为 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/
我是一名优秀的程序员,十分优秀!