我有以下代码:
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中但不在list1中的byte []数组(标记为“this array”的数组),而是只返回list2的全部内容。那么我尝试了以下内容:
List<byte[]> list3 = new List<byte[]>();
foreach (byte[] array in list2)
if (!list1.Contains(array))
list3.Add(array);
但是这得到了同样的结果。我做错了什么?
答案 0 :(得分:8)
Except
和Contains
都会调用对象的Equals
方法。但是,对于数组,Equals
只执行引用相等性检查。要比较内容,请使用SequenceEqual
扩展方法。
您必须更改循环中的支票:
List<byte[]> list3 = new List<byte[]>();
foreach (byte[] array in list2)
if (!list1.Any(a => a.SequenceEqual(array)))
list3.Add(array);
答案 1 :(得分:0)
您的列表只包含一个元素。它们中的每一个都包含一个字节数组,并且这些字节数组彼此不同,这就是Except
和您的实现返回相同结果的原因。
我不是c#专家,但您可以尝试定义以下列表:
List<byte> list1 = new List<byte>();
答案 2 :(得分:0)
使用Equals功能。假设cont_stream
是一个字节数组,那么
bool b = cont_stream[1].Equals(cont_stream[2]);