2012-10-25 11 views
8

Sorry für die Neuling Frage. Könnte mir jemand helfen? Einfaches Array hier. Was ist die beste/einfachste Methode, um zu überprüfen, ob alle Benutzereingaben eindeutig und nicht doppelt sind?Wie überprüfe ich in diesem Array nach doppelten Antworten? C#

Dank
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(); 
    } 
} 

}

ich hinzugefügt haben, sollte ich prüfen muss geschehen, bevor die Zahlen ausgegeben werden. Dank

+0

Die Antworten unten zeigen Ihnen, wie Sie Überprüfen Sie, nachdem Sie sie zu lbNumbers.Items hinzugefügt haben. Sie können auch überprüfen, wie Sie sie für Sie hinzufügen. –

Antwort

15

Ein einfacher Ansatz ist über LINQ:

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

Hallo. Ich habe das benutzt und es kommt immer als falsch zurück. Habe ich es falsch benutzt? – Rob

+0

Was ich meine ist, ich setze dies auf, dann hinzugefügt, wenn (allUnique == wahr) dann wird es angezeigt, wenn nicht, dann erscheint es eine Nachricht, die nach eindeutigen Zahlen fragt. Ist das nicht der richtige Weg dies zu nutzen? – Rob

+0

Ich habe das funktioniert. Danke Jon. – Rob

1

Der einfachste Weg, meiner Meinung nach, wäre Einsatz alle Werte innerhalb eines Satzes und dann überprüfen, ob seine Größe auf dem Array ist gleich Größe. Ein Satz kann keine doppelten Werte enthalten. Wenn also ein Wert doppelt ist, wird er nicht in den Satz eingefügt.

Dies ist auch in der Komplexität in Ordnung, wenn Sie nicht Millionen von Werten haben, weil die Einfügung in eine Menge in O(logn) Zeit erfolgt, so wird die Gesamtüberprüfungszeit O(nlogn) sein.

Wenn Sie etwas optimale Komplexität möchten, können Sie dies, indem Sie durch das Array in O(n) Zeit tun, und jeden Wert in eine Hash-Karte gefunden setzen während dessen Wert erhöhen: wenn der Wert im Satz nicht existiert, Sie fügen es mit count = 1 hinzu. Wenn es vorhanden ist, erhöhen Sie seine Anzahl. Dann gehen Sie durchlaufen Sie die Hash-Karte und überprüfen Sie, dass alle Werte eine Anzahl von haben.

2

Ein anderer Ansatz verwendet ein HashSet<string>:

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

oder mit 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 effizienter ist, wenn die Sequenz sehr groß ist, da es nicht das Set komplett schafft aber eine nach einander und wird false zurückgeben, sobald es ein Duplikat entdeckt.

Hier ist eine Demo dieses Effekts: http://ideone.com/G48CYv

  • HashSet Konstruktor Speicherverbrauch: 50 MB, Dauer: 00: 00: 00,2962615
  • Enumerable.All Speicherverbrauch: 0 MB, Dauer: 00: 00: 00,0004254

Msdn

Die HashSet<T> Klasse bietet leistungsstarke Set-Operationen. Ein Set ist eine Sammlung, die keine doppelten Elemente enthält und deren Elemente in keiner bestimmten Reihenfolge sind.

1

Wenn Sie versuchen, nur um sicherzugehen, dass Ihr listbox nicht über dups dann verwenden:

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

Was dazu:

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

Warnung, wenn jemand diesen Code verwenden: sein Ergebnis ist ungültig und mein Versuch, es zu korrigieren wurde abgelehnt (Grund gegeben: meine "Bearbeitung weicht von der ursprünglichen Absicht des Beitrags. Auch Änderungen, die drastisch machen müssen Änderungen sollten sich bemühen, die Ziele des Postbesitzers zu bewahren "). –

Verwandte Themen