首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查两个字节数组的相等性

检查两个字节数组的相等性
EN

Stack Overflow用户
提问于 2013-08-27 18:27:02
回答 5查看 54.3K关注 0票数 34

我正在检查两个字节数组的相等性,我需要一些帮助,因为即使数组应该是相等的,也会返回false。

在我的调试中,我可以看到a1和b1都是相等的,但是它不会在while循环中增加i。

代码语言:javascript
复制
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])

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-27 18:33:37

您需要在某个地方添加一个返回值。这应该是可行的:

代码语言:javascript
复制
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;
}

但这要简单得多:

代码语言:javascript
复制
return a1.SequenceEqual(b1);

或者,您可以使用来自IStructuralEquatable 4的.NET:

代码语言:javascript
复制
return ((IStructuralEquatable)a1).Equals(b1, StructuralComparisons.StructuralEqualityComparer)

如果性能需要考虑,我建议重写代码以使用Binary类,该类针对这种用例进行了专门优化:

代码语言:javascript
复制
public bool Equality(Binary a1, Binary b1)
{
    return a1.Equals(b1);
}

我的机器上的快速基准测试提供了以下数据:

代码语言:javascript
复制
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文件自己运行基准测试。

票数 61
EN

Stack Overflow用户

发布于 2013-08-27 18:32:20

要检查等式,只需编写:

代码语言:javascript
复制
var areEqual =  a1.SequenceEqual(b1);
票数 43
EN

Stack Overflow用户

发布于 2013-08-27 19:01:13

我建议使用一些短路来使事情变得更简单,并且在数组是相同的引用(a1 = b1)的情况下,使用object.ReferenceEquals来短路:

代码语言:javascript
复制
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;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18472867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档