我怎么能快速做到这一点?
当然,我可以这样做:
static bool ByteArrayCompare(byte[] a1, byte[] a2)
{
if (a1.Length != a2.Length)
return false;
for (int i=0; i<a1.Length; i++)
if (a1[i]!=a2[i])
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找BCL功能或一些经过高度优化的可靠方法来实现这一目标.
java.util.Arrays.equals((sbyte[])(Array)a1, (sbyte[])(Array)a2);
Run Code Online (Sandbox Code Playgroud)
很好地工作,但它看起来不适用于x64.
请注意我的超快速的答案在这里.
我注意到这两个接口,以及几个相关的类,已经在.NET 4中添加了.它们对我来说似乎有点多余; 我已经阅读了几个关于它们的博客,但我仍然无法弄清楚它们在.NET 4之前解决了哪些棘手问题.
什么是使用IStructuralEquatable和IStructuralComparable?
System.Collections.IStructuralEquatable并System.Collections.IStructuralComparable在.NET 4中添加,但为什么它们不是通用的,比如IEquatable<T>和IComparable<T>?
我正在寻找性能有效的方法来比较两个字节[]的相等性.大小超过1 MB,因此应尽量减少每个数组元素的开销.
我的目标是通过避免两个数组的重复绑定检查来击败每个项目的速度SequenceEqual或手动编码的for循环.以同样的方式导致快速,会导致什么?Array.Copymemcpymemcmp
我是否忘记了显而易见的,或者是"手动"比较器最好的方法?
基本上,我只想比较类型(小)字节数组的内容.如果所有字节都匹配,则结果应为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)));
Run Code Online (Sandbox Code Playgroud)
手动功能:
/// <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 || …Run Code Online (Sandbox Code Playgroud) 我有以下C#代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
char[] st = "stackoverflow".ToCharArray();
char[] ca = { 's', 't', 'a', 'c', 'k' };
if (st.Take(5) == ca)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine("Failure");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它旨在将"成功"写入控制台,但它始终打印"失败".任何帮助将非常感激.
arrays ×4
c# ×4
.net ×3
equality ×3
comparison ×2
performance ×2
.net-4.0 ×1
byte ×1
char ×1
generics ×1
icomparable ×1
j# ×1