2015-03-05 3 views
2

Я только что забыл очевидное, или «ручной» сравнитель - лучший способ пойти?C# - byte array - byte [] - Есть ли простой компаратор?

В принципе, я просто хочу сравнить содержимое типа (малых) байтовых массивов. Если все байты совпадают, результат должен быть истинным, иначе 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; 
} 
+0

'Array.Equals',' Buffer.Equals' и т. Д. - это то же самое: 'Object.Equals'. Как 'Array', так и' Buffer'derive от 'Object', вы просто вызываете статический метод' Object.Equals', используя имя производного типа. Это проверит ссылочное равенство. –

+0

Я только что видел параметр 'SequenceEqual' в [этот вопрос] (http://stackoverflow.com/questions/1389570/c-sharp-byte-array-comparison-issue) –

+1

' best' не очень хорошо метрика :-) Скорость, совместимость, краткость письма, простота понимания, ... – xanatos

ответ

6

Вы ищете SequenceEqual метод.

a.SequenceEqual(b); 

Определяет, будут ли две последовательности равны путем сравнения элементов, используя компаратор равенство по умолчанию для их типа.

+2

Следует отметить, что 'SequenceEqual', похоже, реализован так, чтобы просто перебирать и перечислять и сравнивать элемент за элементом, и возвращать false если одно перечисление заканчивается раньше другого. Если выполняется много сравнений между множеством массивов разной длины, то проверка совпадения длин будет более разумным. –

+0

Спасибо - это, безусловно, «одна» из вещей, которые я пропустил (до того, как я посмотрел ответы на связанные вопросы). Не уверен, есть ли опция «shortcut-to-false», если массивы byte [] имеют разную длину ... Но по крайней мере у меня есть на что посмотреть. Я не был уверен, что если 'Buffer' и' Array' внедрили собственную перегрузку простого 'Object' или нет, значит, причина для проверки. –

+0

@Steven_W: «Не знаю, есть ли опция« shortcut-to-false », если массивы byte [] имеют разные длины ...» - ну, я уверен, я просто проверил, что делают реальные сборки с помощью [ILSpy ] (http://ilspy.net/). –