Vorrei confrontare due raccolte (in C #), ma non sono sicuro del modo migliore per implementarlo in modo efficiente.
Ho letto l'altro thread su Enumerable.SequenceEqual , ma non è esattamente quello che sto cercando.
Nel mio caso, due raccolte sarebbero uguali se contengano entrambe gli stessi articoli (indipendentemente dall'ordine).
Esempio:
collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};
collection1 == collection2; // true
Quello che faccio di solito è scorrere attraverso ogni elemento di una raccolta e vedere se esiste nell'altra raccolta, quindi scorrere attraverso ogni elemento dell'altra raccolta e vedere se esiste nella prima raccolta. (Comincio confrontando le lunghezze).
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
Tuttavia, questo non è del tutto corretto e probabilmente non è il modo più efficiente per confrontare due raccolte per l'uguaglianza.
Un esempio che posso pensare che sarebbe sbagliato è:
collection1 = {1, 2, 3, 3, 4}
collection2 = {1, 2, 2, 3, 4}
Il che sarebbe uguale alla mia implementazione. Devo solo contare il numero di volte in cui viene trovato ciascun elemento e accertarmi che i conteggi siano uguali in entrambe le raccolte?
Gli esempi sono in una sorta di C # (chiamiamolo pseudo-C #), ma diamo la tua risposta in qualunque lingua tu voglia, non importa.
Nota: ho usato numeri interi negli esempi per semplicità, ma voglio essere in grado di usare anche oggetti di tipo riferimento (non si comportano correttamente come chiavi perché viene confrontato solo il riferimento dell'oggetto, non il contenuto).