Chciałbym porównać dwie kolekcje (w C #), ale nie jestem pewien, jaki jest najlepszy sposób na wydajne wdrożenie tego.
Przeczytałem inny wątek o Enumerable.SequenceEqual , ale nie jest to dokładnie to, czego szukam.
W moim przypadku dwie kolekcje byłyby równe, gdyby obie zawierały te same elementy (bez względu na kolejność).
Przykład:
collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};
collection1 == collection2; // true
Zwykle robię pętlę przez każdy element jednej kolekcji i sprawdzam, czy istnieje w drugiej kolekcji, a następnie przechodzę w pętli przez każdy element z drugiej kolekcji i sprawdzam, czy istnieje w pierwszej kolekcji. (Zaczynam od porównania długości).
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
Jednak nie jest to całkowicie poprawne i prawdopodobnie nie jest to najbardziej efektywny sposób porównywania dwóch kolekcji pod kątem równości.
Przykład, o którym mogę pomyśleć, byłby zły:
collection1 = {1, 2, 3, 3, 4}
collection2 = {1, 2, 2, 3, 4}
Co byłoby równe mojej realizacji. Czy mam po prostu policzyć, ile razy każdy przedmiot został znaleziony i upewnić się, że liczby są równe w obu kolekcjach?
Przykłady są w jakimś języku C # (nazwijmy to pseudo-C #), ale udziel odpowiedzi w dowolnym języku, to nie ma znaczenia.
Uwaga: Użyłem liczb całkowitych w przykładach ze względu na prostotę, ale chcę również móc używać obiektów typu referencyjnego (nie zachowują się one poprawnie jak klucze, ponieważ porównywane jest tylko odniesienie do obiektu, a nie treść).