Я хотел бы сравнить две коллекции (в 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 #), но давать ответ на любом языке, который вы пожелаете, это не имеет значения.
Примечание: я использовал целые числа в примерах для простоты, но я хочу иметь возможность также использовать объекты ссылочного типа (они не работают корректно в качестве ключей, потому что сравнивается только ссылка на объект, а не содержимое).