c# - C# 中 Java Objects.hash 和 Objects.hashCode 的等价物
问题描述
从 Java 转向 C# 开发人员。在 Java 中,我使用了很多Objects.hash(array)和Objects.hashCode(object)在 hashCode 函数中构建对象的哈希码。我在 C# 中找不到这些函数的等效项。有任何想法吗?
事实上,我可以调用GetHashCode
并组合它们,如Concise way to combine field hashcodes 所示?,但这需要null
对引用类型进行大量检查,这使得代码比可比较的 Java 代码长得多。
在 Java 中:
public class MyObject {
private Integer type;
private String[] attrs;
@Override
public int hashCode() {
int hash = 1, p = 31;
hash = p * hash + Objects.hashCode(type); // Handle Null case
hash = p * hash + Objects.hash(attrs); // Handle Null case
return hash;
}
}
在 C# 中:
public class MyObject {
private int? type;
private string[] attrs;
public override int GetHashCode()
int hash = 1, p = 31;
hash = p * hash + hash_of(type); // Any utilities?
hash = p * hash + hash_of_array(attrs); // Any utilities?
return hash;
}
}
注意:我不是在寻找兼容的结果(因为我知道哈希码对于类似的对象会有所不同,甚至在同一框架的版本/平台之间也可能不同),而是寻找代码大小和简洁的方式。
解决方案
与此等效的 .NET 是 new System.HashCode
,特别是HashCode.Combine<>
可用于从多个值创建哈希码的方法:
public class MyObject
{
private int? type;
private string[] attrs;
public override int GetHashCode()
=> HashCode.Combine(type, attrs);
// remember to also override Equals
}
请注意,此类型仅在 .NET Core 中可用。如果您在 .NET Framework 上运行,则必须自己实现哈希码计算。此处记录了执行此操作的好方法。
推荐阅读
- azure - 我如何使用 terraform 运行特定的虚拟机
- excel - 选择一个文件并复制到 Excel VBA 中的文件夹
- python - 无法在 Windows 上使用 pipenv 创建环境
- javascript - React - Rxjs:在流中转换父组件事件处理程序
- javascript - div上的悬停问题,水平滚动出现在最后一个div上
- google-apps-script - 谷歌 adon 中的清单文件
- flutter - 在按钮上的文本字段小部件中显示输出 在 Flutter 中单击按钮计算后单击按钮
- java - 如何自定义请求正文的示例值并使用 springdoc-open-api 在 swagger-ui 上执行它
- jquery - 如何在一个`.on` jQuery代码中使用两个事件
- go - 如何模拟 amqp.Dial 等库中的函数