| Autor |
Beitrag |
backstein
Hält's aus hier
Beiträge: 8
Win XP SP3
C# .NET 3.5
|
Verfasst: Mo 22.12.08 22:27
Ich habe eine Listbox mit maximal 32 Einträgen gefüllt und möchte nun aus ihr, in irgendeiner Form, zweimal vier zufällig gewählte Einträge in zwei neuen Listboxen auflisten.
Ich komme auf dieses Problem, da ich beim erstellen einer Turniertabelle mit Excel gescheitert bin und es nun mit C# versuche, womit ich ein bisschen mehr Erfahrung habe.
Könnt ihr mir hier helfen?
Google spuckt zu beiden Aspekten äußerst unbefriedigende Ergebnisse aus...
Danke
Zuletzt bearbeitet von backstein am Fr 26.12.08 03:31, insgesamt 5-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 22.12.08 23:13
Hallo und  !
Ich vermute einmal dies hier wird dir helfen:
www.geekpedia.com/tu...rs-using-Csharp.html
Oder kommst du mit den ListBoxen auch nicht klar?
|
|
backstein 
Hält's aus hier
Beiträge: 8
Win XP SP3
C# .NET 3.5
|
Verfasst: Di 23.12.08 01:10
Ich kenne Math.Ran aber ich weiss nicht, wie ich das mit meinem Vorhaben in Verbindung setzen soll...
Hast du eine Idee?
MfG
Zuletzt bearbeitet von backstein am Di 23.12.08 05:42, insgesamt 2-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 23.12.08 01:25
Du könntest Fisher Yates benutzen um die Einträge zufällig zu vermischen und dann einfach die ersten 8 nehmen.
en.wikipedia.org/wiki/Fisher-Yates_shuffle
www.pherg.net/2007/1...d-shuffle-algorithm/
Und dann gibts dafür noch die Tricks von .NET, aber das wohl erst ab .NET 3.5, falls du das hast  :
stackoverflow.com/qu...-a-string-array-in-c
|
|
miniC#
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: Di 23.12.08 02:52
hm,
entweder verstehe ich das problem nicht oder ich hab ein brett vorm kopp ? ich würde einfach den inhalt der ursprungscombobox in eine List<String> schreiben und dann den kram verteilen ? muss doch net so kompliziert sein ?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| class Program { static void Main(string[] args) { List<String> cmbBox = new List<string>() { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" }; List<String> output = shuffle(cmbBox, 4);
foreach (String s in output) { Console.WriteLine(s); } Console.ReadLine(); }
static List<String> shuffle(List<String> input, int count) { List<String> outp = new List<string>(); Random r = new Random();
for (int i = 0; i < count; i++) { int z = r.Next(input.Count); outp.Add(input[z]); input.RemoveAt(z); } return outp; } } |
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
backstein 
Hält's aus hier
Beiträge: 8
Win XP SP3
C# .NET 3.5
|
Verfasst: Di 23.12.08 03:11
Aber wenn ich nicht irre, list er so die Elemente aus der Listbox nicht von alleine aus oder doch?
Jedenfalls gibt er mir im Moment in der Zielbox "a", "b", "c"... (immerhin) random aus.
Gruß
Zuletzt bearbeitet von backstein am Di 23.12.08 05:42, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 23.12.08 04:54
Du musst natürlich an die Methode shuffle deinen Inhalt der ListBox übergeben und die zurückgegebene Liste in die andere ListBox eintragen. Das mit den Zeichen a bis j ist ja nur ein Beispiel wie du die Methode benutzen kannst.
|
|
backstein 
Hält's aus hier
Beiträge: 8
Win XP SP3
C# .NET 3.5
|
Verfasst: Di 23.12.08 05:20
Ich bin auch schon eine ganze Weile dabei irgendwie die Elemente aus der Listbox dort einzubringen.
Aber ich habe keinen korrekten Ansatzpunkt.
Kannst du mir da weiterhelfen?
Ich bin leider noch ziemlich grün hinter den Ohren, ich hoffe, ich finde hier trotzdem Rat.
Habe noch so einige Fragen...
Grüße
|
|
miniC#
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: Di 23.12.08 16:25
hm, bin eigentlich davon ausgegangen, dass eine combobox eine methode der marke "getEnumerator" oder so hat. musst halt per hand basteln. sowas ginge zum beispiel :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| private void button1_Click(object sender, RoutedEventArgs e) { Random r = new Random(System.DateTime.Now.Millisecond); List<String> source = getCmbBox(comboBox1); setCmbBox(comboBox2, shuffle(source, 4,r)); setCmbBox(comboBox3, shuffle(source, 4,r)); } private List<String> shuffle(List<String> input, int count, Random r) { List<String> outp = new List<string>();
for (int i = 0; i < count; i++) { int z = r.Next(input.Count); outp.Add(input[z]); input.RemoveAt(z); } return outp; } private List<String> getCmbBox(ComboBox source) { List<string> outp = new List<string>();
foreach (ComboBoxItem c in source.Items) { outp.Add(c.Content.ToString()); } return outp; } private void setCmbBox(ComboBox target, List<string> values) { target.Items.Clear(); foreach (string s in values) { target.Items.Add(s); } } |
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
backstein 
Hält's aus hier
Beiträge: 8
Win XP SP3
C# .NET 3.5
|
Verfasst: Do 25.12.08 18:11
Super, scheint soweit gut auszusehen, doch im getter findet sich folgender Fehler:
| Zitat: | | Der Typ- oder Namespacename "ListBoxItem" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) |
Ein frohes Fest
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 25.12.08 18:26
In der Referenz kannst du ja einfach schauen um welchen Namespace es sich handelt:
msdn.microsoft.com/d...ols.listboxitem.aspx
|
|
backstein 
Hält's aus hier
Beiträge: 8
Win XP SP3
C# .NET 3.5
|
Verfasst: Do 25.12.08 18:58
Mit...
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| private List<String> getListBox(ListBox source) { List<string> outp = new List<string>(); foreach (System.Windows.Controls.ListBoxItem c in source.Items) { outp.Add(c.Content.ToString()); } return outp; } |
...geht es auch nicht.
| Zitat: | | Der Typ- oder Namespacename "Controls" ist im Namespace "System.Windows" nicht vorhanden. (Fehlt ein Assemblyverweis?) |
Doch eigentlich dürfte es so stimmen. Oder bau ich den Verweis auf andere Art ein?
Gruß und Danke für die schnelle Antwort
|
|
miniC#
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: Do 25.12.08 19:18
verweise findest du im projektbaum. bei einem neuen winforms oder wpf projekt sollte allerdings schon auf die entsprechenden datein verwiesen sein.
dein beispiel hat nichts mit einem verweis zu tun, du schreibst nur die namespaces aus, in der die klasse zu finden ist. dafür sind die using direktiven da.
C#-Quelltext 1: 2: 3: 4: 5:
| using myNamespace.mySubspace;
[...] private myNamespace.mySubspace.myClass x; private myClass y; |
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
Zuletzt bearbeitet von miniC# am Do 25.12.08 19:20, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 25.12.08 19:19
System.Windows.Controls ist ein WPF-Namespace. Unter WinForms gibt es AFAIK keine ListBoxItem-Klasse. Die Items einer Listbox sind da halt von dem Typ, den Du reinsteckst 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 25.12.08 19:20
|
|
backstein 
Hält's aus hier
Beiträge: 8
Win XP SP3
C# .NET 3.5
|
Verfasst: Do 25.12.08 20:44
Dankeschön!
Wie folgt funktioniert es nun:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| private void button3_Click(object sender, EventArgs e) { if (listBox1.Items.Count >= 4) { if (listBox1.Items.Count < 8) { Random r = new Random(System.DateTime.Now.Millisecond); List<String> source = getListBox(listBox1); setListBox(listBox2, shuffle(source, 4, r)); }
else { Random r = new Random(System.DateTime.Now.Millisecond); List<String> source = getListBox(listBox1); setListBox(listBox2, shuffle(source, 4, r)); setListBox(listBox3, shuffle(source, 4, r)); } }
else { MessageBox.Show("Bitte fügen Sie mindestens vier Spieler hinzu!"); } }
private List<String> shuffle(List<String> input, int count, Random r) { List<String> outp = new List<string>(); for (int i = 0; i < count; i++) { int z = r.Next(input.Count); outp.Add(input[z]); input.RemoveAt(z); } return outp; }
private List<String> getListBox(ListBox source) { List<string> outp = new List<string>(); foreach (String c in source.Items) { outp.Add(c); } return outp; }
private void setListBox(ListBox target, List<string> values) { target.Items.Clear(); foreach (string s in values) { target.Items.Add(s); } } |
Danke für eure Hilfe.
Ich merke schon, dass ich die Leute hier mit Fragen konfrontiere, die eigentlich eher etwas für ein Einsteigerforum sind. Doch daran mangelt es leider
Ich versuche in Zukunft so weit wie möglich mit Hilfe meines Buches zu kommen, welches mich aber bei diesem Probem im Stich gelassen hat.
Manche grundlegenden Punkte sind mir nunmal noch nicht so selbstverständlich und man muss mich mit der Nase darauf stoßen.
Das Turnier ist zwar inzwischen rum, doch war trotzdem ein voller Erfolg.
In meinem Dartclub werden wir das Programm zum Training gut gebrauchen.
... Wenn es einmal fertig ist, denn noch muss ich die Spielergebnisse in einer Tabelle auflisten usw..
Naja, ihr werdet wahrscheinlich nochmal von mir hören
Habe auch noch einen Bekannten, der auf dem Gebiet echt spitze ist. Und hier sind es hunderte
Noch einmal tausend Dank,
schöne Feiertage und einen guten Rutsch in ein gesundes und erfolgreiches 2009! 
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 25.12.08 21:06
backstein hat folgendes geschrieben : | | Ich merke schon, dass ich die Leute hier mit Fragen konfrontiere, die eigentlich eher etwas für ein Einsteigerforum sind. Doch daran mangelt es leider =). |
Das Forum ist für Einsteiger genauso wie für Fortgeschrittene. Jeder ist willkommen solange man Eigeninitiative zeigt, wie in deinem Fall.
Da ist es egal, wie trivial die Frage für manchen sein mag. Wenn jemand Hilfe braucht, weil er nicht weiter kommt, dann braucht er sie, ob nun Anfänger oder Fortgeschrittener.
backstein hat folgendes geschrieben : | | Ich versuche in Zukunft so weit wie möglich mit Hilfe meines Buches zu kommen |
Das ist immer gut, und wenn du damit und mit der Suche im Internet / hier im Forum nicht weiter kommst, dann frag ruhig. Dafür ist das Forum ja da.
Und dann habe ich da noch einen Verbesserungsvorschlag:
Du liest ja die erste Listbox aus, egal ob es nun nur 4 oder mehr Einträge sind. Deshalb kannst du das auch aus der if-Abfrage herausnehmen, die ersten drei Zeilen werden ja bei 4 oder mehr Einträgen ohnehin immer ausgeführt: C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| private void button3_Click(object sender, EventArgs e) { if (listBox1.Items.Count >= 4) { Random r = new Random(System.DateTime.Now.Millisecond); List<String> source = getListBox(listBox1); setListBox(listBox2, shuffle(source, 4, r)); if (listBox1.Items.Count >= 8) { setListBox(listBox3, shuffle(source, 4, r)); } }
else { MessageBox.Show("Bitte fügen Sie mindestens vier Spieler hinzu!"); } } |
|
|
backstein 
Hält's aus hier
Beiträge: 8
Win XP SP3
C# .NET 3.5
|
Verfasst: Fr 26.12.08 00:31
Danke jaenicke!
Ich war mir nur nicht sicher, ob ich denn so auch eine Mehrfachnennung vermeide =)
Gruß und schönen Abend noch
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 26.12.08 01:37
Du führst ja die selben Befehle aus, nur dass sie nicht doppelt da stehen  .
Und das erste shuffle entfernt ja die zurückgegebenen Einträge aus source, so dass diese danach nicht mehr erneut ausgewählt werden können.
Dabei ist es ja egal, ob die beiden Aufrufe direkt hintereinander stehen oder einer nach dem ersten in der if-Abfrage steht.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 26.12.08 12:05
Hallo,
noch eine (für die Praxis wichtige) Verbesserung: Der Zufallsgenerator sollte nur einmal innerhalb einer Klasse (Formular) erstellt werden und später immer mit Random.Next aufgerufen werden. Wenn er mehrfach "zu dicht hintereinander" erstellt wird, ist die Gefahr zu groß, dass die Werte nicht mehr zufällig sind, sondern sich sehr ähneln.
Gruß und nochmals Frohe (Rest-) Weihnachten! Jürgen
|
|