Я хотел бы сравнить две коллекции (в C #), но я не уверен, что это лучший способ реализовать это эффективно.
Я читал в другой ветке о Enumerable.SequenceEqual , но это не совсем то, что я ищу.
В моем случае две коллекции были бы равны, если бы они содержали одинаковые предметы (независимо от порядка).
Пример:
collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};
collection1 == collection2; // true
Что я обычно делаю, это перебираю каждый элемент одной коллекции и вижу, существует ли он в другой коллекции, затем перебираю каждый элемент другой коллекции и проверяю, существует ли он в первой коллекции. (Я начинаю со сравнения длин).
if (collection1.Count != collection2.Count)
return false; // the collections are not equal
foreach (Item item in collection1)
{
if (!collection2.Contains(item))
return false; // the collections are not equal
}
foreach (Item item in collection2)
{
if (!collection1.Contains(item))
return false; // the collections are not equal
}
return true; // the collections are equal
Однако это не совсем правильно, и, вероятно, это не самый эффективный способ сравнить две коллекции на равенство.
Пример, который я могу представить, был бы неправильным:
collection1 = {1, 2, 3, 3, 4}
collection2 = {1, 2, 2, 3, 4}
Что было бы равным моей реализации. Стоит ли просто подсчитать, сколько раз найден каждый предмет, и убедиться, что количество совпадений в обеих коллекциях одинаково?
Примеры приведены в некотором роде C # (назовем это псевдо-C #), но давать ответ на любом языке, который вы пожелаете, не имеет значения.
Примечание: Я использовал целые числа в примерах для простоты, но я хочу иметь возможность также использовать объекты ссылочного типа (они не работают корректно в качестве ключей, поскольку сравнивается только ссылка на объект) , а не содержание).