我正在检查两个字节数组的相等性,我需要一些帮助,因为即使数组应该是相等的,也会返回false。
在我的调试中,我可以看到a1和b1都是相等的,但是它不会在while循环中增加i。
public bool Equality(byte[] a1, byte[] b1)
{
int i;
bool bEqual;
if (a1.Length == b1.Length)
{
i = 0;
while ((i < a1.Length) && (a1[i]==b1[i]))
{
i++;
}
if (i == a1.Length)
{
bEqual = true;
}
}
return bEqual;
}这总是返回false:(a1[i]==b1[i])。
发布于 2013-08-27 18:33:37
您需要在某个地方添加一个返回值。这应该是可行的:
public bool Equality(byte[] a1, byte[] b1)
{
int i;
if (a1.Length == b1.Length)
{
i = 0;
while (i < a1.Length && (a1[i]==b1[i])) //Earlier it was a1[i]!=b1[i]
{
i++;
}
if (i == a1.Length)
{
return true;
}
}
return false;
}但这要简单得多:
return a1.SequenceEqual(b1);或者,您可以使用来自IStructuralEquatable 4的.NET:
return ((IStructuralEquatable)a1).Equals(b1, StructuralComparisons.StructuralEqualityComparer)如果性能需要考虑,我建议重写代码以使用Binary类,该类针对这种用例进行了专门优化:
public bool Equality(Binary a1, Binary b1)
{
return a1.Equals(b1);
}我的机器上的快速基准测试提供了以下数据:
Method Min Max Avg
binary equal: 0.868 3.076 0.933 (best)
for loop: 2.636 10.004 3.065
sequence equal: 8.940 30.124 10.258
structure equal: 155.644 381.052 170.693下载这个LINQPad文件自己运行基准测试。
发布于 2013-08-27 18:32:20
要检查等式,只需编写:
var areEqual = a1.SequenceEqual(b1);发布于 2013-08-27 19:01:13
我建议使用一些短路来使事情变得更简单,并且在数组是相同的引用(a1 = b1)的情况下,使用object.ReferenceEquals来短路:
public bool Equality(byte[] a1, byte[] b1)
{
// If not same length, done
if (a1.Length != b1.Length)
{
return false;
}
// If they are the same object, done
if (object.ReferenceEquals(a1,b1))
{
return true;
}
// Loop all values and compare
for (int i = 0; i < a1.Length; i++)
{
if (a1[i] != b1[i])
{
return false;
}
}
// If we got here, equal
return true;
}https://stackoverflow.com/questions/18472867
复制相似问题