如何比较两个数组列表

本文关键字:两个 数组 列表 比较 何比较 | 更新日期: 2023-09-27 18:15:44

我有以下代码:

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);

,但这得到了相同的结果。我做错了什么?

如何比较两个数组列表

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);

您的列表只包含一个元素。每一个都包含一个字节数组,这些字节数组彼此不同,这就是为什么Except和你的实现返回相同的结果。

我不是c#专家,但是你可以尝试定义以下列表:

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

使用Equals函数。假设cont_stream是一个字节数组,那么

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