List(Of T) mixen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von markus.obi.

    List(Of T) mixen

    Hallo!

    Ich habe eine List(Of T) erstellt.

    Die Structure ist so aufgebaut:

    VB.NET-Quellcode

    1. Private Structure Categoryy
    2. Public CategoryName As String
    3. Public CategoryId, PagesCount As Integer
    4. End Structure



    Da die Elemente auf der Website immer eine konstante Aufstellung haben,
    landen sie natürlich chronologisch immer genau nacheinander in der Liste.

    Jetzt würde ich die Elemente der List(Of T) gerne mischen. Besteht da irgendeine Möglichkeit?
    Das einzige, was mir jetzt dazu einfällt, wäre:

    VB.NET-Quellcode

    1. Dim rnd As Random
    2. Select Case rnd.Next(1, 6)
    3. Case 1
    4. Dim list As New List(Of Category1))
    5. Case 2
    6. Dim list As New List(Of Category2))
    7. ' und so weiter
    8. End Select
    9. Private Structure Category1
    10. Public CategoryName As String
    11. Public CategoryId, PagesCount As Integer
    12. End Structure
    13. Private Structure Category2
    14. Public CategoryName As String
    15. Public PagesCount, CategoryId As Integer
    16. End Structure


    Ich hoffe ich hab deine Frage richtig verstanden.

    Vincent ;)
    Ich nehme an mit "mischen" meinst du eine neue zufällige Reihenfolge.
    Eine Möglichkeit wäre es, eine neue Liste zu erstellen und dann N mal einen zufälligen Eintrag aus Liste1 auszuwählen, diesen an Liste2 anzuhängen und dann mittels RemoveAt aus Liste1 zu entfernen.
    Dabei muss man beachten, dass Liste1 ständig kleiner wird. Dass heißt, der Zufallsgenerator (bitte Random Klasse verwenden) muss immer eine Zahl aus dem Bereich {0, 1, ... , Liste1.Count-1} auswürfeln.


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim liste1 As New List(Of Integer) From {1, 2, 3, 4, 5, 6}
    2. Dim liste2 As New List(Of Integer)
    3. Dim rnd As New Random(Now.Millisecond) 'z.B. Zeit als Seed
    4. For i = 0 To liste1.Count - 1
    5. Dim index As Integer = rnd.Next(0, liste1.Count)
    6. Debug.Write(liste1.Item(index))
    7. liste2.Add(liste1.Item(index))
    8. liste1.RemoveAt(index)
    9. Next
    10. Debug.WriteLine("")

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „markus.obi“ ()

    Bei Random muss man aber auch schauen, dass wirklich alle Einträge gefunden werden.

    Wenn Random jetzt 2x die gleiche Zahl auswirft(z.B zweimal die 7) dann fehlt vielleicht Eintrag 6 oder 8.

    Vincent Du hast mich irgendwie falsch Verstanden:

    Es geht um keine neuen Structures/Lists sondern nur um die Einträge die andere Index Positionen in der List(Of T) annehmen sollen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kevin Hombre“ ()

    @Kevin Hombre

    So hab ich es letztens mit Musik gemacht.

    VB.NET-Quellcode

    1. Private Sub Shuffle(ByVal lst As System.Collections.IList)
    2. Static rnd As New Random()
    3. For i As Integer = 1 To lst.Count - 1
    4. Swap(lst, i, rnd.Next(i + 1))
    5. Next
    6. End Sub
    7. Public Sub Swap(ByVal lst As IList, ByVal i1 As Integer, ByVal i2 As Integer)
    8. Dim tmp As Object = lst(i1)
    9. lst(i1) = lst(i2)
    10. lst(i2) = tmp
    11. End Sub

    Kevin Hombre schrieb:

    Bei Random muss man aber auch schauen, dass wirklich alle Einträge gefunden werden.

    Wenn Random jetzt 2x die gleiche Zahl auswirft(z.B zweimal die 7) dann fehlt vielleicht Eintrag 6 oder 8..


    Nein, weil ich in der ursprünglichen Liste das entsprechende Element (7) entferne. Siehe Post #3.