2012-10-25 1 views
8

Ci scusiamo per la domanda per principianti. Qualcuno potrebbe aiutarmi? Array semplice qui. Qual è il metodo migliore/più semplice per verificare che tutti gli input dell'utente siano unici e non duplicati? GrazieCome posso verificare la presenza di risposte duplicate in questo array? C#

private void btnNext_Click(object sender, EventArgs e) 
    { 

     string[] Numbers = new string[5]; 


     Numbers[0] = txtNumber1.Text; 
     Numbers[1] = txtNumber2.Text; 
     Numbers[2] = txtNumber3.Text; 
     Numbers[3] = txtNumber4.Text; 
     Numbers[4] = txtNumber5.Text; 


     foreach (string Result in Numbers) 
     { 
      lbNumbers.Items.Add(Result); 
     } 

     txtNumber1.Clear(); 
     txtNumber2.Clear(); 
     txtNumber3.Clear(); 
     txtNumber4.Clear(); 
     txtNumber5.Clear(); 
    } 
} 

}

avrei dovuto aggiungere che ho bisogno di controllare per accadere prima che i numeri sono in uscita. Grazie

+0

Le risposte che seguono mostrano come controllare dopo averli aggiunti a lbNumbers.Items. puoi anche controllare quando li aggiungi in foreach. –

risposta

15

Un approccio semplice è tramite LINQ:

bool allUnique = Numbers.Distinct().Count() == Numbers.Length; 
+0

Ciao. L'ho usato e restituisce sempre come falso. L'ho usato in modo sbagliato? – Rob

+0

Quello che voglio dire è che ho impostato questo, poi aggiunto se (allUnique == true) poi viene visualizzato, in caso contrario viene visualizzato un messaggio che richiede numeri univoci. Non è questo il modo corretto di usarlo? – Rob

+0

Ho ottenuto questo lavoro. Grazie Jon. – Rob

1

Il modo più semplice, a mio parere, sarebbe quello di inserto tutti i valori all'interno di un insieme e poi di controllo se la sua dimensione è uguale alla matrice del dimensione. Un set non può contenere valori duplicati, quindi se qualche valore è duplicato, non verrà inserito nel set.

Questo è anche OK in complessità se non si dispone di milioni di valori, perché l'inserimento in un set è fatto in tempo O(logn), quindi il tempo totale di controllo sarà O(nlogn).

Se volete qualcosa ottimale in termini di complessità, è possibile farlo in O(n) tempo passando attraverso l'array, e mettendo ogni valore trovato in una mappa di hash, incrementando il suo valore: se il valore non esiste nel set, lo aggiungi con count = 1. Se esiste, aumenti il ​​suo conteggio. Quindi, si passare attraverso la mappa di hash e controllare che tutti i valori abbiano un conteggio di uno.

2

altro approccio utilizza una HashSet<string>:

var set = new HashSet<string>(Numbers); 
if (set.Count == Numbers.Count) 
{ 
    // all unique 
} 

o con Enumerable.All:

var set = new HashSet<string>(); 
// HashSet.Add returns a bool if the item was added because it was unique 
bool allUnique = Numbers.All(text=> set.Add(text)); 

Enunmerable.All è più efficace quando la sequenza è molto grande in quanto non crea la serie completamente ma uno dopo l'un l'altro e restituirà false non appena rileva un duplicato.

Ecco una demo di questo effetto: http://ideone.com/G48CYv

  • HashSet consumo di memoria del costruttore: 50 MB, durata: 00: 00: 00,2962615
  • Enumerable.All consumo di memoria: 0 MB, Durata: 00: 00: 00,0004254

MSDN

Il 01.234.521,135966 millions La classeoffre operazioni set ad alte prestazioni. Un set è una raccolta che non contiene elementi duplicati e i cui elementi non sono in ordine particolare.

1

Se si sta solo cercando di fare in modo che la tua casella di riepilogo non ha dups quindi utilizzare questo:

if(!lbNumbers.Items.Contains(Result))  
    lbNumbers.Items.Add(Result); 
0

che dire di questo:

public bool arrayContainsDuplicates(string[] array) { 
    for (int i = 0; i < array.Length - 2; i++) { 
    for (int j = i + 1; j < array.Length - 1; j++) { 
     if (array[i] == array[j]) return true; 
    } 
    } 
    return false; 
} 
+0

Attenzione se qualcuno usa questo codice: il suo risultato non è valido e il mio tentativo di correggerlo è stato respinto (motivo indicato: il mio "edit devia dall'intenzione originale del post. Anche le modifiche che devono rendere drastico i cambiamenti dovrebbero sforzarsi di preservare gli obiettivi del proprietario del post "). –