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

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

примечание: в списке никогда не будет дубликатов (без повторяющихся значений)

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

2 ответов


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

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

bool areEqual = listA.SequenceEqual( listB );

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

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

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

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

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


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

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

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

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

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