2017-06-05 7 views
0

Ich arbeite gerade an einem Turniermanager für M.U.G.E.N. Es liest die Kämpfer aus einer SQL Server-Datentabelle und speichert die Zeilen in einer ListBox. Es sollte auch zufällig 16 Kämpfer davon auswählen.C# Wie kann ich HashSet-Werte mit ListBox verwenden?

Ich habe bereits einen Zufallsgenerator und ein HashSet erstellt - um Duplikate zu vermeiden - innerhalb einer While-Schleife, so dass dieser Prozess nur stoppt, wenn 16 Kämpfer ausgewählt wurden. Dies ist, was ich bisher geschrieben:

private void buttonRandom_Click(object sender, EventArgs e) 
     /* 
     * Randomly pick 16 fighters from the "Registered" ListBox 
     * Only unique IDs are allowed 
     */ 
    { 
     Random contestantPicker = new Random(); 
     HashSet<int> fighters = new HashSet<int>(); 
     while (fighters.Count < 16) // Run Random until 16 fighters have been picked 
     { 
      fighters.Add(contestantPicker.Next(0, listBoxRegistered.Items.Count)); 
     } 
    } 

Nun ist die Frage: Wie kann ich die Zahlen in einem HashSet gespeichert verwenden, um Elemente mit ihrem entsprechenden Indizes von einem ListBox an einem anderen List-Box zu kopieren?

Antwort

0

Nachdem Sie Ihre HashSet generiert haben, durchlaufen Sie sie und suchen Sie die entsprechenden Elemente nach ihrem Index.

So:

//old code 
Random contestantPicker = new Random(); 
HashSet<int> fighters = new HashSet<int>(); 
while (fighters.Count < 16) // Run Random until 16 fighters have been picked 
{ 
    fighters.Add(contestantPicker.Next(0, listBoxRegistered.Items.Count)); 
} 

//list to hold fighter names 
List<string> fightersList = new List<string>(); 

//iterate through all indexes in hashset 
for (int i = 0; i < fighters.Count; i++) 
{ 
    //show in output window 
    Diagnostics.Debug.WriteLine("figther number {0}, named: {1}", i + 1, listBoxRegistered.GetItemText(listBoxRegistered.Items[fighters.ElementAt(i)])); 

    //add fighters to list... 
    fightersList.Add(listBoxRegistered.GetItemText(listBoxRegistered.Items[fighters.ElementAt(i)])); 
} 

//... and show it in some message box 
MessageBox.Show(string.Join(", ", fightersList.ToArray())); 
+0

OK, nach der for-Schleife habe ich die Liste in ein Array geändert, und es zeigt die Einzelteile mit foreach. Aber es zeigt nur System.Data.DataRowView. Selbst wenn ich ListBox.GetItemText (ListBox.Items) verwende, zeigt es nur nutzlose Informationen an. –

+0

es zeigt nur einen Buchstaben pro Zeile von was ich denke, ist System.Windows.Forms. –

+0

Ich habe meinen Code bearbeitet ... jetzt verwende ich 'GetItemText' von' ListBoxItem' mit Index i. Probieren Sie es jetzt. – Nino