Как сравнить два списка массивов? - PullRequest
4 голосов
/ 27 ноября 2011

У меня есть следующий код:

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 содержал только массивы byte [], которые есть в list2, но не в list1 (тот, что помечен как «этот массив»), но вместо этогопросто возвращает все из list2.Тогда я попробовал следующее:

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

, но это дало мне тот же результат.Что я делаю не так?

Ответы [ 3 ]

8 голосов
/ 27 ноября 2011

И 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);
0 голосов
/ 06 декабря 2011

использовать функцию Equals. Предположим, что cont_stream является байтовым массивом, тогда

bool b = cont_stream[1].Equals(cont_stream[2]);
0 голосов
/ 27 ноября 2011

Ваши списки содержат только один элемент.Каждый из них содержит байтовый массив, и эти байтовые массивы отличаются друг от друга, поэтому Except и ваша реализация возвращают один и тот же результат.

Я не эксперт по AC #, но вы могли быПопробуйте определить следующие списки:

List<byte> list1 = new List<byte>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...