C#-字节数组-字节[]-有简单的比较器吗?

C#-字节数组-字节[]-有简单的比较器吗?,c#,arrays,equality,C#,Arrays,Equality,是我忘记了显而易见的,还是“手动”比较器是最好的方法 基本上,我只想比较类型(小)字节数组的内容。如果所有字节都匹配,则结果应为true,否则为false 我希望找到Array.Equals或Buffer.Equals会有帮助 演示代码: var a = new byte[]{1, 2, 3, 4, 5}; var b = new byte[]{1, 2, 3, 4, 5}; Console.WriteLine(string.Format("== : {0}", (a == b)))

是我忘记了显而易见的,还是“手动”比较器是最好的方法

基本上,我只想比较类型(小)字节数组的内容。如果所有字节都匹配,则结果应为true,否则为false

我希望找到
Array.Equals
Buffer.Equals
会有帮助

演示代码:

  var a = new byte[]{1, 2, 3, 4, 5};
  var b = new byte[]{1, 2, 3, 4, 5};
  Console.WriteLine(string.Format("== : {0}", (a == b)));
  Console.WriteLine(string.Format("Equals : {0}", a.Equals(b)));
  Console.WriteLine(string.Format("Buffer.Equals : {0}", Buffer.Equals(a, b)));
  Console.WriteLine(string.Format("Array.Equals = {0}", Array.Equals(a, b)));
  Console.WriteLine(string.Format("Manual_ArrayComparer = {0}", ArrayContentsEquals(a, b)));
手动功能:

/// <summary>Returns true if all elements of both byte-arrays are identical</summary>
public static bool ArrayContentsEquals(byte[] a, byte[] b, int length_to_compare = int.MaxValue)
{
  if (a == null || b == null) return false;
  if (Math.Min(a.Length, length_to_compare) != Math.Min(b.Length, length_to_compare)) return false;
  length_to_compare = Math.Min(a.Length, length_to_compare);
  for (int i = 0; i < length_to_compare; i++) if (a[i] != b[i]) return false;
  return true;
}
///如果两个字节数组的所有元素都相同,则返回true
公共静态布尔数组内容序列(字节[]a,字节[]b,int-length\u-to\u-compare=int.MaxValue)
{
如果(a==null | | b==null)返回false;
if(Math.Min(a.Length,Length\u to\u compare)!=Math.Min(b.Length,Length\u to\u compare))返回false;
length\u to\u compare=Math.Min(a.length,length\u to\u compare);
对于(int i=0;i
您正在寻找方法

通过使用元素类型的默认相等比较器来比较元素,确定两个序列是否相等


Array.Equals
Buffer.Equals
等实际上是一样的:
Object.Equals
。由于
数组
缓冲区
都是从
对象
派生的,因此您只需使用派生类型名调用静态
对象.Equals
方法。这将检查引用的相等性。我刚刚看到
best
中的
SequenceEqual
选项不是一个好的指标:-)速度、兼容性、书写速度短、易于理解,…应该注意的是,
SequenceEqual
的实现方式似乎只是在两个枚举上迭代并逐元素比较,如果一个枚举结束得比另一个早,则返回false。如果在许多不同长度的数组之间进行多次比较,那么首先检查长度是否匹配将是一种更明智的方法。谢谢-这肯定是我错过的“一件事”(在我查看相关问题的答案之前)-如果byte[]数组的长度不同,则不确定是否有“false快捷方式”选项。。。但至少我有东西要看。我不确定
缓冲区
数组
是否实现了简单
对象
的重载-这就是签入的原因。@Steven_W:“不确定如果字节[]数组的长度不同,是否有“false的快捷方式”选项…”-嗯,我确定,我刚刚检查了实际程序集的用途。参考资料也可以在referencesource.microsoft.com上找到。虽然我已经将其标记为“答案”,但我也很欣赏@xanatos-
SequenceEqual
的附加注释,这是我错过的内置功能,但手动方法(和链接问题)也有其优点,如清晰性、速度等。。。在本例中,我只比较了大约8个字节(而不是性能关键的部分),因此可能会坚持使用手动方法—多亏了大家。
a.SequenceEqual(b);