Каков наилучший способ сравнения 2 целых списков/массивов в С#

Я хочу сравнить 2 целых списка для равенства. Я рад заранее разобраться с ними, если это станет проще. Вот пример двух вещей, которые я хочу сравнить. Для ниже, я хочу, чтобы результат был прав.

ПРИМЕЧАНИЕ: в списке никогда не будет дубликатов (без повторных значений)

 List<int> list = new List<int>(){1, 4,6,7};
 int[] myArray = new int[]{1, 6,7 ,4};

Ответы

Ответ 1

Что означает для вас равенство при сравнении списков? Вам все равно, что списки точно такие же.... одни и те же элементы в одном порядке? Или просто укажите один и тот же набор значений, независимо от порядка.

Если вы действительно хотите проверить, что списки содержат одну и ту же последовательность значений в одном порядке, вы можете использовать метод SequenceEqual() в LINQ:

bool areEqual = listA.SequenceEqual( listB );

Если списки не совпадают с порядком, вы можете сначала отсортировать их:

bool areEqual = listA.OrderBy(x=>x).SequenceEqual( listB.OrderBy(x=>x) );

Если списки могут содержать дубликаты, а дубликаты не имеют значения (по отношению к равенству), вы можете использовать сравнение сравнения:

bool setEqual = new HashSet<int>( listA ).SetEquals( listB );

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

Ответ 2

Похоже, вы хотите сравнить их как множество... в этом случае:

HashSet<int> hashSet = new HashSet<int>(list);
if (hashSet.SetEquals(myArray))
{
    ...
}

Обратите внимание, что это будет считаться равным 1, 2, 2, 3} и {1, 3, 2, 3, 1}. Это то, что вы хотите?

Почти наверняка что-то построенное, в котором вы будете делать то, что хотите, но вам нужно быть точным в своем описании:)

EDIT: Как вы уже сказали, повторных элементов не будет, это должно быть хорошо. Возможно, было бы разумно документировать предположение.