Arrays in einer Liste sortieren

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Lukas97.

    Arrays in einer Liste sortieren

    Hallo.

    Ich habe eine List(Of Array) mit 9 Items. Jedes Item hat 3 Werte, jeweils 2 Strings und 1 Double. Ich benötige das aber in sortierter Reihenfolge, sodass das Array mit dem höchsten Double-Wert an erster Stelle steht und dann absteigend.

    Aktuell habe ich folgenden Code, welcher aber nicht funktioniert.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim umsätzeList As New List(Of Double)
    2. For i As Integer = 0 To UmsatzList.Count - 1
    3. umsätzeList.Add(UmsatzList.Item(i)(2))
    4. Next
    5. umsätzeList.Sort()
    6. umsätzeList.Reverse()
    7. Dim UmsatzListSortiert As New List(Of Array)
    8. For i As Integer = 0 To UmsatzList.Count - 1
    9. For i2 As Integer = 0 To umsätzeList.Count - 1
    10. If umsätzeList.Item(i2) = UmsatzList.Item(i)(2) Then
    11. UmsatzListSortiert.Add(UmsatzList.Item(i))
    12. End If
    13. Next
    14. Next


    Liege ich auf den richtigen Weg? Bzw, hat jemand einen Codeschnipsel für mich?
    Ich bin über jede Hilfe dankbar.
    Hi
    für sowas verwendet man i.A. Klassen:

    VB.NET-Quellcode

    1. Public Class SomeClass
    2. Public Property X As Double
    3. Public Property Y As String
    4. Public Property Z As String
    5. 'Konstruktor: Wird aufgerufen, wenn man New SomeClass(...) aufruft
    6. Public Sub New(x As Double, y As String, z As String)
    7. Me.X = x
    8. Me.Y = y
    9. Me.Z = z
    10. End Sub
    11. End Class

    Über List(Of T).Sort lässt sich das dann wie folgt realisieren:

    VB.NET-Quellcode

    1. Dim umsätzeList As New List(Of SomeClass)()
    2. umsätzeList.Sort(Function(l, r) Math.Sign(r.X - l.X))

    Zur Erklärung: Sortierung funktioniert i.A. anhand eines Vergleiches zweier Argumente (hier l und r). Vom Vergleich wird ein Integer zurückgegeben. l steht vor r, wenn der Rückgabewert für den Vergleich < 0 ist (l < r), r steht vor l, wenn der Rückgabewert für den Vergleich > 0 ist (r < l), ansonsten sind beide an der gleichen Position. Function(l, r) Math.Sign(l.X - r.X) ist ein Lambda-Ausdruck, der in dem Fall für den Vergleich verwendet wird.

    Viele Grüße
    ~blaze~
    Funktioniert bei mir nicht. Er sagt mir, dass ich Array nicht in "SortClass" umwandeln kann.

    VB.NET-Quellcode

    1. Dim test As New List(Of SortClass)()
    2. For i As Integer = 0 To UmsatzList.Count - 1
    3. test.Add(UmsatzList.Item(i))
    4. Next
    5. test.Sort(Function(l, r) Math.Sign(r.UmsatzMit - l.UmsatzMit))

    Aber richtig ist das schon, oder? ^^
    du solltest auch weder SortClass noch Array verwenden.
    Gugge Blazes Code: Da steht was von SomeClass, und nix von Array.

    Array soll man nie verwenden. Das ist nur die Basisklasse aller Arrays, also von Integer-Array, Double-Array, String-Array etc.
    Also einfach nicht verwenden.
    Auch richtige Arrays sind für dich hier ungeeignet, denn die Elemente eines Arrays haben alle denselben Typ (Integer, Double, String etc.)

    Verwende einfach, was Blaze dir gezeigt hat.

    Falls ich dein Interesse auch für Arrays wecken konnte, gugge Grundlagen: Fachbegriffe
    Aber wie gesagt: Arrays haben hier so oder so nix verloren.
    Hmm.

    Entweder ihr versteht mich falsch, oder ich euch.
    Jedes Item in der List(Of Array) sieht so aus:

    Quellcode

    1. -Item0
    2. -String
    3. -String
    4. -Double
    5. -Item1
    6. -String
    7. -String
    8. -Double
    9. ...

    Das ganze 10x.
    Ich möchte jetzt das wie folgt haben, dass das Item, welches den höchsten double-Wert hat, an oberster Stelle steht und die anderen dann absteigend sortiert sind. Es bringt mir rein garnix, wenn ich am Ende nur die Double-Werte sortiert habe aber den Rest nicht. Es muss unbedingt zusammenbleiben, sonst habe ich am Ende Probleme.
    Jou.
    @Lukas97 Und wenn Du dann der Klasse SomeClass von @~blaze~ noch eine schicke Überladung von .ToString() mitgiebst, kannst Du Dir die Daten im unterbrochenen Programmlauf mit HOver ansehen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SomeClass
    2. Public Property X As Double
    3. Public Property Y As String
    4. Public Property Z As String
    5. 'Konstruktor: Wird aufgerufen, wenn man New SomeClass(...) aufruft
    6. Public Sub New(x As Double, y As String, z As String)
    7. Me.X = x
    8. Me.Y = y
    9. Me.Z = z
    10. End Sub
    11. Public Overloads Function ToString() As String
    12. Return String.Format("{0} {1} {2}", X, Y, Z)
    13. End Function
    14. End Class

    =>
    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!
    Du hast einen anderen Ansatz verwendet, Lukas. Du verwendest ein Array, um drei Daten zu speichern, aber die Herangehensweise ist sehr unübersichtlich. Anstatt ein Array zu verwenden, verwendet man für sowas Klassen oder Strukturen. Die drei Arrayeinträge String, String, Double werden dann in der SomeClass-Klasse von mir dargestellt, sodass das Array überflüssig wird und die Datenrepräsentation übersichtlich ist. Wenn du dann den code von mir hernimmst, werden alle Werte im Array so sortiert, wie du es dir wünscht (sofern ich keinen Fehler gemacht hab :D )

    Viele Grüße
    ~blaze~