在编写程序时,我最近遇到了一个奇怪的问题。在使用==
运算符时,两个字节的八个值的数组(每个值具有相同的值)被报告为不相等,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
任何人都可以提供一些输入,说明为什么这些字节数组不被认为是相同的?
答案 0 :(得分:5)
任何人都可以提供一些输入,说明为什么这些字节数组不被认为是相同的?
这非常简单:数组类型不会覆盖Equals
或GetHashCode
(或确实ToString
) - 因此您可以从System.Object
获得实现。 Equals
中的System.Object
实现仅比较引用标识,GetHashCode
尝试尽可能为每个对象提供唯一的哈希码。你有两个独立的数组对象,所以它们是不相等的(对对象的引用是不同的),它们的哈希码也不太可能相等。
数组类型可以覆盖这些方法,但它们不会。您可以编写自己的IEqualityComparer<T>
实现,尽管如此。请注意,使用数组作为哈希表键通常是一个坏主意,因为数组总是可变的。你必须确定不会改变数组,这会改变哈希码。
请注意,标准集合也不会覆盖这些方法 - 例如List<T>
等。
根据我的经验,比较数组的最常见用法是单元测试 - 通常单元测试框架有方法为你做这个(例如在CollectionAsserts
类中)。或LINQ提供Enumerable.SequenceEqual
,如其他答案所述。
如果您可以告诉我们您正在尝试做的事情,我们可以为您提供更多帮助。
答案 1 :(得分:4)
这是因为id
和od
是两个独立的数组,具有不同的指针。
如果您想知道他们的条目是否相同,您应该检查每个值的相等性。
答案 2 :(得分:0)