2011-11-26 139 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]);