Ci sono più domande correlate, ma sto cercando una soluzione specifica per il mio caso. Esiste una matrice di (in genere) 14 numeri interi. Come posso dire rapidamente se ogni int appare esattamente due volte (cioè ci sono 7 coppie)? Il range di valori va da 1 a 35. L'aspetto principale qui è la performance.Come posso sapere rapidamente se un elenco contiene solo duplicati?
Per riferimento, questa è la mia soluzione attuale. È stato scritto per assomigliare il più fedelmente le specifiche possibile e senza prestazioni in mente, quindi sono certo si può essere migliorata notevolmente:
var pairs = Array
.GroupBy (x => x)
.Where (x => x.Count() == 2)
.Select (x => x.ToList())
.ToList();
IsSevenPairs = pairs.Count == 7;
utilizzando LINQ è opzionale. Non mi importa come, fintanto che è veloce :)
Edit: C'è il caso particolare che un int appare volte 2n con n> 1. In questo caso il controllo deve fallire, vale a dire che dovrebbe essere 7 coppie distinte.
Edit: Risultato ho provato soluzioni di Ani e Jon con piccoli cambiamenti e ha scoperto durante il punto di riferimento più eseguito in applicazione di destinazione che Ani offre circa il doppio il throughput di Jon sulla mia macchina (alcuni Core 2 Duo su Win7-64). Generare la gamma di intere dura già tanto quanto i rispettivi controlli, quindi sono soddisfatto del risultato. Ringrazia tutti!
L'array del numero è ben ordinato? Dovresti dirci se c'è qualcosa di speciale nell'array, che può aiutare a migliorare la soluzione. –
Attualmente sto analizzando le risposte per decidere chi otterrà +15. – mafu
@Danny L'array non è ordinato. Non riesco a pensare a nulla di utile a parte ciò che ho affermato finora. – mafu