2011-11-26 137 views
4

我有以下代碼:如何比較兩個數組列表?

List<byte[]> list1 = new List<byte[]>(); 
list1.Add(new byte[] { 0x41, 0x41, 0x41, 0x41, 0x78, 0x56, 0x34, 0x12 }); 

List<byte[]> list2 = new List<byte[]>(); 
list2.Add(new byte[] { 0x41, 0x41, 0x41, 0x41, 0x78, 0x56, 0x34, 0x12 }); 
list2.Add(new byte[] { 0x42, 0x42, 0x42, 0x42, 0x78, 0x56, 0x34, 0x12 }); // this array 

IEnumerable<byte[]> list3 = list2.Except(list1); 

我想項目list3只包含字節[]數組是在list2中而不是在列表1(一個標有「本陣」),而是它只是返回所有的list2。所以然後我嘗試了以下內容:

List<byte[]> list3 = new List<byte[]>(); 
foreach (byte[] array in list2) 
    if (!list1.Contains(array)) 
     list3.Add(array); 

但是這給了我相同的結果。我究竟做錯了什麼?

回答

8

兩個ExceptContains調用對象的方法Equals。但是,對於數組,Equals只是執行參考相等性檢查。要比較內容,請使用SequenceEqual擴展方法。

你必須改變你的支票在循環:

List<byte[]> list3 = new List<byte[]>(); 
foreach (byte[] array in list2) 
    if (!list1.Any(a => a.SequenceEqual(array))) 
     list3.Add(array); 
+0

我懷疑這會是這樣的排序是這樣,也沒有找到任何簡單地做它的路權,而無需通過每個陣列中的每個字節一個循環。非常感謝! – user1067239

0

您的列表只包含一個元素。它們中的每一個都包含一個字節數組,並且這些字節數組彼此不同,這就是Except和您的實現返回相同結果的原因。

我不是一個C#專家,但你可以嘗試定義以下列表:

List<byte> list1 = new List<byte>(); 
0

使用的Equals功能。假設cont_stream是一個字節數組,然後

bool b = cont_stream[1].Equals(cont_stream[2]);