1

在编写程序时,我最近遇到了一个奇怪的问题。8个值的两个字节数组,每个值都相同,使用==运算符时报告为不相等,并且值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

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

4

3 回答 3

6

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

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

数组类型可以覆盖这些方法,但它们不会。您可以编写自己的实现,IEqualityComparer<T>但可以做到这一点。请注意,无论如何,使用数组作为哈希表键通常不是一个好主意,因为数组总是可变的。您必须真正确定没有任何东西会改变数组,这会改变哈希码。

请注意,标准集合也不会覆盖这些方法 - 诸如此类的东西List<T>

以我的经验,比较数组是否相等的最常见用途是在单元测试中——通常单元测试框架有方法为你做这件事(例如在一个CollectionAsserts类中)。或 LINQ 提供Enumerable.SequenceEqual,如其他答案中所述。

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

于 2013-05-11T09:47:27.350 回答
5

那是因为idandod是两个独立的数组,具有不同的指针。如果您想知道它们的条目是否相同,您应该检查每个值的相等性。

于 2013-05-11T09:47:47.663 回答
0

发生这种情况是因为idod指向不同的对象。

您可以使用Enumerable类来比较数组的内容

Enumerable.SequenceEqual(id, od);

于 2013-05-11T09:50:00.660 回答