2012-09-09 111 views
25

我有兩個字節數組完全相同的內容。我想:如何比較兩個字節數組

if (bytearray1 == bytearray2) {...} else {...} 

if (Array.Equals(bytearray1, bytearray2)) {....} else {...} 

所有的時間它會轉到別的!我不知道爲什麼!我手動檢查了兩個陣列幾次!

+1

請參閱相關:http://stackoverflow.com/questions/43289/comparing-two -byte-arrays-in-net – Anthony

回答

65

嘗試使用SequenceEqual擴展方法。例如:

byte[] a1 = new byte[] { 1, 2, 3 }; 
byte[] a2 = new byte[] { 1, 2, 3 }; 
bool areEqual = a1.SequenceEqual(a2); // true 
8

==運算符和Equals方法都將測試引用相等性。既然你有兩個獨立的數組,它們將永遠不會相等。

由於您想要測試兩個陣列具有相同順序的內容,請嘗試使用SequenceEqual方法。

12

==運營商通過參考進行比較;那是兩個不同的例子。

Array.Equals確實是Object.Equals,它調用實例Equals方法。
由於陣列不會覆蓋Equals(),所以也通過引用進行比較。

而應該調用LINQ SequenceEqual()方法。

-4

作爲替代方案,如果你不喜歡使用LINQ可以使用System.Convert類...

byte[] a1; 
byte[] a2; 

if (System.Convert.ToBase64String(a1) == System.Convert.ToBase64String(a2)) { 
    doSomething(); 
} 
else { 
    doSomethingElse(); 
} 
+6

我會「不舒適」將兩個數組轉換爲字符串,然後再次迭代字符串以進行比較。我寧願使用LINQ方法迭代一次,或者製作自己的方法。 –

+1

非常不必要的低效率。就像Davi Fiamenghi所說的,要麼使用SequenceEqual,要麼只是做簡單的循環比較。 – chris

+0

這將取決於比較的一方是否已經在base64中,但在這種情況下,您可能會轉換另一方。當你想呈現人類可讀的byte []數組時,這種場景是相當普遍的。例如,使用散列進行文檔驗證時 –