Kombinatorik Listboxen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Kombinatorik Listboxen

    Hallo VB Gemeinde,

    ich beschäftige mich derzeit mit VB und bräuchte zu einem "Problem" eine mögliche Lösung. Wäre spitze wenn mir jemand helfen könnte.
    Ich versuche alle möglichen Kombinationen aus n-Listboxen zu finden. Jede Listbox kann m-Einträge besitzen.

    In diesem Fall habe ich nur 3 Listboxen, können jedoch mehr werden!

    Als Beispiel:

    VB.NET-Quellcode

    1. Dim i As Integer
    2. Dim f As Integer
    3. Dim g As Integer
    4. For i = 0 To ListBox1.Items.Count - 1
    5. For f = 0 To ListBox2.Items.Count - 1
    6. For g = 0 To ListBox4.Items.Count - 1
    7. ListBox5.Items.Add(ListBox1.Items.Item(i) & ";" & ListBox2.Items.Item(f) & ";" & ListBox4.Items.Item(g))
    8. Next
    9. Next
    10. Next


    Jetzt zu meiner Frage:
    Ist es möglich, dies etwas flexibler zu gestalten? Die Anzahl der "Listboxen" variabel zu halten?
    Hierbei steh ich etwas auf der Leitung.

    Vielen Dank & Gruß
    Daniel
    Erstmal willkommen im Forum. :)

    Bevor ich mich dem Variabel gestalten widme noch eine Frage zwischendurch:

    Ist es gewollt das du i Mal die f schleife Ausführst die i*f mal die g schleife ausführt ?
    Du hast deine Schleifen gerade verschachtelt..

    Das Dynamisch gestalten könntest du mit einer extra funktion Lösen, der du ein Control übergibst und dieses control dann ansprichst. So kannst du z.B. eine Schleife durch alle Combo boxen auf deiner Form machen und diese immer der Funktion übergeben.
    Vielen Dank für die schnelle Antwort!
    Es ist eigentlich schon gewollt, da ich wirklich alle Kombinationen aus den Einträgen in den Listboxen erhalten will.
    Gibt's hierfür noch eine andere Lösung? Bin leider noch etwas unerfahren in der Geschichte.

    Gruß
    Daniel
    @DanielB Willkommen im Forum. :thumbup:
    Deine Herangehensweise ist absolut falsch.
    Nicht ListBoxen werden kombiniert, sondern Einträge, die sich in Deinem Fall zufällig in ListBoxen befinden :!:
    1. In VB machst Du Option Strict On. Da lernst Du den richtigen Umgang mit Datentypen.
    2. Trenne Daten und GUI, d.h., die Quelle Deiner Daten ist dem Kombinationsalgorithmus egal.
    Mach Dir in jedem Falle eine List(Of String) für jede ListBox (Quelle und Ziel), wo Du die Daten von der GUI trennst.
    Wahrscheinlich ist es für Dich zunächst besser, für jede weitere ListBox eine weitere For-Schleife darum zu packen und die entsprechenden Eintrräge zu berücksichtigen.
    Gugst Du z.B. hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    PSJ schrieb:

    Ist es gewollt das du i Mal die f schleife Ausführst die i*f mal die g schleife ausführt ?
    Ja, das ist bei Kombinatorik-Problemen prinzipiell sinnvoll (in diesem Fall aber (variable viele Input-Listen) unzureichend - wie der TE selbst erkannt hat).

    @TE: Sehr problematisch ist, dass du nicht in Daten denkst, sondern in Listboxen.
    Datenverarbeitung heißt Datenverarbeitung, weil Daten verarbeitet werden, nicht Listboxen. Die "Listboxen-Denke" ist ein weit verbreitetes Anfänger-Problem, und man sollte möglichst schnell davon wegkommen.
    Wie gesagt: Daten verarbeiten, und Listboxen (allgemeiner: alle Controls) dienen nur der Präsentation ( = sowohl angucken als auch Eingabe) für den User.
    Daten und Präsentation immer getrennt halten. Zunächst im Kopf trennen, dem folgend dann auch im Code.

    Die richtige Fragestellung wären also zwei:
    1) "Ich habe mehrere List(Of String), und will eine Ergebnisliste, die jeden String mit jedem anderen String der anderen Listen verketten, also ich will die Listen-Einträge permutieren. Wie?
    2) "Ich habe eine List(of String) (zB das Ergebnis), und will die anzeigen. Wie?

    Zu 1) habich Tut gemacht: Permutationen
    Zu 2) ganz einfach:

    VB.NET-Quellcode

    1. Listbox1.DataSource = myResultList




    Ausserdem verheerend wichtig ist beim Programmieren, die verschiedenen Datentypen zu unterscheiden und zu berücksichtigen. Ich habe schon damit angefangen, indem ich annahm, dass deine Daten vom Typ String sind (muss ja garnet stimmen, geht aus der Frage aber nicht hervor, zeigt, dass du Datentypen noch nicht differenziert betrachtest.)
    Aber beim "Listbox-Denken" kann man die Datentypen garnet wahrnehmen, und dementsprechend kann man auch kaum jemals brauchbaren Code entwickeln.
    Beim Unterscheiden von Datentypen ist eine extrem wichtige HIlfe (must-do-no-excuses!), das VisualStudio so einzustellen, dass Datentyp-Fehler von vornherein garnet erst zugelassen werden:
    Visual Studio - Empfohlene Einstellungen
    Wie gesagt: dieser letztere Link ist fast keine Empfehlung mehr, sondern ist ein Must-Do.
    Ich zumindest sehe mittelfristig gar keinen Sinn darin, Programmierern zu helfen, die einen Integer nicht von einem String unterscheiden können, und die es auch nicht lernen wollen.
    @DanielB In die List(Of String) packst Du die einzelnen Werte der Permutation und übergibst sie als DataSource an die Listbox.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!