gpt4 book ai didi

c# - 两个相同值的字节数组不相等

转载 作者:太空宇宙 更新时间:2023-11-03 17:54:05 24 4
gpt4 key购买 nike

在编写程序时,我最近遇到了一个奇怪的问题。当使用==运算符时,两个字节数组的八个值(每个值均相同)被报告为不相等,并且GetHashCode()的值也不同。

byte[] id = new byte[8] {
0x00, 0x00, 0x00, 0x00,
0xF8, 0x00, 0x00, 0x00
};
byte[] od = new byte[8] {
0x00, 0x00, 0x00, 0x00,
0xF8, 0x00, 0x00, 0x00
};

Console.WriteLine(id == od);
Console.WriteLine(id.GetHashCode());
Console.WriteLine(od.GetHashCode());
Console.ReadLine();


该程序到控制台的输出如下:

False
45653674
41149443


谁能提供一些关于为什么不认为这些字节数组相等的输入?

最佳答案

谁能提供一些关于为什么这些字节数组不相等的输入?


这很简单:数组类型不会覆盖EqualsGetHashCode(或者实际上是ToString)-因此您可以从System.Object获取实现。 Equals中的System.Object实现只是比较引用标识,而GetHashCode尝试尽可能为每个对象提供唯一的哈希码。您有两个单独的数组对象,因此它们是不相等的(对对象的引用是不同的),并且它们的哈希码也不大可能相等。

数组类型可以覆盖这些方法,但不能。您可以编写自己的IEqualityComparer<T>实现,尽管这样做。请注意,将数组用作哈希表键通常不是一个好主意,因为数组始终是可变的。您必须真正确保没有任何东西可以改变数组,而这会改变哈希码。

请注意,标准集合也不会覆盖这些方法,例如List<T>等。

根据我的经验,比较数组是否相等的最常见用法是在单元测试中-通常单元测试框架具有为您执行此操作的方法(例如在CollectionAsserts类中)。或者LINQ提供Enumerable.SequenceEqual,如其他答案中所述。

如果您可以告诉我们有关您要做什么的更多信息,我们可以为您提供更多帮助。

关于c# - 两个相同值的字节数组不相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16495795/

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