【问题标题】:C# - byte array - byte[] - Is there a simple comparer? [duplicate]C# - 字节数组 - byte[] - 有没有简单的比较器? [复制]
【发布时间】:2015-05-06 18:48:38
【问题描述】:

我是不是忘记了显而易见的事情,还是“手动”比较器是最好的选择?

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

我原以为Array.EqualsBuffer.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;
}

【问题讨论】:

  • Array.EqualsBuffer.Equals 等实际上是一回事:Object.Equals。由于ArrayBufferderive 都来自Object,因此您只是使用派生类型名称调用静态Object.Equals 方法。这将检查引用相等性。
  • 我刚刚在this question 中看到了SequenceEqual 选项
  • best 不是一个很好的衡量标准 :-) 速度、兼容性、写作短促、易于理解……

标签: c# arrays equality


【解决方案1】:

您正在寻找SequenceEqual 方法。

a.SequenceEqual(b);

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

【讨论】:

  • 应该注意SequenceEqual 的实现方式似乎只是迭代两个枚举并逐个元素进行比较,如果一个枚举比另一个更快结束则返回 false。如果在多个不同长度的数组之间进行多次比较,那么首先检查长度是否匹配会是一种更明智的方法。
  • 谢谢——这肯定是我错过的“一件事”(在我查看相关问题的答案之前)——如果byte[] 数组的长度不同......但至少我有一些东西要看。我不确定BufferArray 是否实现了他们自己的简单Object 的重载 - 因此签入的原因。
  • @Steven_W:“如果 byte[] 数组的长度不同,则不确定是否有“shortcut-to-false”选项......” - 好吧,我确定,我刚刚检查了什么实际的程序集使用ILSpy
  • 参考资料也可以在 referencesource.microsoft.com 上找到。这是SequenceEqual
  • 虽然我已将其标记为“答案”,但我也很欣赏额外的 cmets,例如 @xanatos - SequenceEqualinbuilt 函数我错过了,但是手动方法(和链接的问题)也有它们的优点,为了清晰,速度等......在这种情况下,我只比较大约 8 个字节(而不是在性能关键部分) ,所以可能会坚持手动方法 - 谢谢大家。
猜你喜欢
  • 2011-01-11
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多