List(Os String()) nach mehreren Spalten sortieren

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von doLob.

    List(Os String()) nach mehreren Spalten sortieren

    Bin schon Betriebsblind und finde keine Lösung.
    Ich lese in einer Schleife die Daten der Audiospuren eines Streams in ein Array ein und füge sie dann zu einer Liste hinzu.
    Die Liste hat z.B. folgenden Audiodaten:

    Format, Kanäle, Streamnummer

    AC3 , 2 channel, 1
    AC3 , 6 channel, 2
    Mp2, 2 channel, 4

    Nun möchte ich erst nach Format sortieren. Wenn die Formate gleich sind soll nach den Kanälen sortiert werden undzwar in umgekehrter Folge. Also die 6 channel als erster Wert.
    Und als Ergebnis brauche ich eigentlich nur die Streamnummer.

    Es soll einfach die Streamnummer des qualitativ höchstwertigen Streams zur Weiterverarbeitung ermittelt werden. Also im Beispiel die 2.

    MfG
    Dazu müssstest du dir für jede Spalte eine Klasse schreiben, die IComparable implementiert und die Compare Methode überschreiben (also dass das Element n NACH Element n+1 kommt) und dann ein ein OrderBy() und einmal ein ThenOrderBy() aufrufen. (Das überschreiben der ersten Klasse kannst du im Prinzip weglassen, das für die zweite ist wichtig, da du dann bestimmen kannst, in welcher Reihenfolge die Einträge sortiert werden sollen.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Muss nichtmal sein.
    Eine Klasse dafür zu schreiben, und die zu verwenden (anstatt String-Arrays) empfiehlt sich immer, aber man muss IComparable nicht implementieren.
    Stattdessen kann man so sortieren:

    VB.NET-Quellcode

    1. Dim Items As List(Of AudioMetadata) = ...
    2. Dim Sorted = Items.OrderBy(Function(i) i.Format).ThenByDescending(Function(i) i.Channels)
    3. 'Oder mit LINQ:
    4. Dim Sorted = From i In Items
    5. Order By i.Format, i.Channels Desc
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    ​Order By i.Format, i.Channels Desc
    Fuuu... hab das ​Desc vergessen *augenrollen*
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @doLob Wieso eine List?
    Die Daten schreien doch nach einer DataTable.
    Diese Tabelle kannst Du als DataSource einem DataGridView zuweisen.
    Diese Tabelle kannst Du mit .WriteXml(...) und .ReadXml(...) ganz easy speixchern und laden.
    Diese Tabelle kannst Du mit .Sort(...) nach einer Spalte und Richtung sortieren, gugst Du hier.
    Diese Aufzählung ist sehr unvollständig.
    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!
    @RodFromGermany
    So habe ich es schon probiert. Es ist mir jedoch nicht gelungen nach mehreren Zeilen zu sortieren.
    Nach der ersten Sortierung nach FORMAT hatte ich AC3 in der obersten Row. Da es aber mehr als einen AC3 Format gab, mußte ich diese
    noch nach der Anzahl der CHANNELS sortieren und somit war wieder ein MP3 Format in der ersten Row.
    Beim rumprobieren habe ich auch noch gemerkt, das ich die Bitrate auch noch einbeziehen muß.
    Irgendwie muß ich auch noch eine Möglichkeit einbauen eine eigene Sortierreihenfolge zu bestimmen. Ziel ist es automatisch die qualitativ
    höchstwertige bzw favorisierte Audiospur automatisch auszuwählen. Da bei der alphabetischen Sortierung der Formate AAC vor AC3 kommt suche ich dafür auch noch eine Lösung.

    MfG

    doLob schrieb:

    nach mehreren Zeilen
    Meinst Du nach mehreren Spalten?
    Da musst Du einen eigenen Comparer bauen.
    Sieh Dir mal das hier an, DGV mit 2 Spalten, 1. Spalte Text, 2. Spalte Zahl (Integer).
    Es wird zuerst nach dem Text und danach nach der Zahl sortiert.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub DataGridView1_ColumnHeaderMouseClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
    3. DataGridView1.Sort(New DgvComparerDate())
    4. End Sub
    5. End Class
    6. Class DgvComparerDate
    7. Implements IComparer
    8. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
    9. Dim Row1 As DataGridViewRow = CType(x, DataGridViewRow)
    10. Dim Row2 As DataGridViewRow = CType(y, DataGridViewRow)
    11. Dim name1 As String = Row1.Cells(0).Value.ToString
    12. Dim name2 As String = Row2.Cells(0).Value.ToString
    13. Dim value1 As Integer = CInt(Row1.Cells(1).Value)
    14. Dim value2 As Integer = CInt(Row2.Cells(1).Value)
    15. ' 1. Sortierung nach Spalte 0
    16. If name1 <> name2 Then
    17. Return name1.CompareTo(name2)
    18. End If
    19. ' 2. Sortierung nach Spalte 1
    20. Return value1.CompareTo(value2)
    21. End Function
    22. 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!

    doLob schrieb:

    3. Kriterium
    geht analog, wenn 1. und zweites Kriterium gleich sind.
    Wie willst Du denn Deine mehrspaltige Liste anzeigen?
    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!
    Ich will es garnicht anzeigen.
    Aus einem Multimediastream mit mehreren Tonspuren möcht ich automatisch die bestmöglich automatisch auswählen und nur
    diese und den Videostream weiterverarbeiten. Dazu lese ich alle SteamsDaten schonmal gefilter nach Sprache"German" ein möchte diese nun sortieren.
    Also erst FORMAT (AC3 besser als MP2). Beim mehreren AC3 Streams dann CHANNEL(6 channel besser als 2 channel). Wenn dann immer noch
    mehrere Streams übrig bleiben dann BITRATE(384 besser als 192).
    Dann sollte in der obersten Zeile die beste Wahl stehen und in der Spalte Streamnummer genau diese zum weiterverarbeiten.
    @doLob Sieh Dir mal dies an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim data = New List(Of AudioData)
    4. data.Add(New AudioData("a", "b", 1))
    5. data.Add(New AudioData("a", "c", 1))
    6. data.Add(New AudioData("a", "c", 2))
    7. data.Add(New AudioData("a", "b", 2))
    8. data.Sort()
    9. End Sub
    10. End Class
    11. Public Class AudioData
    12. Implements IComparable
    13. Public Property A As String
    14. Public Property B As String
    15. Public Property C As Integer
    16. Public Sub New(aa As String, bb As String, cc As Integer)
    17. Me.A = aa
    18. Me.B = bb
    19. Me.C = cc
    20. End Sub
    21. Public Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo
    22. Dim oo = CType(obj, AudioData)
    23. If Me.A <> oo.A Then
    24. Return Me.A.CompareTo(oo.A)
    25. End If
    26. If Me.B <> oo.B Then
    27. Return Me.B.CompareTo(oo.B)
    28. End If
    29. Return Me.C.CompareTo(oo.C)
    30. End Function
    31. Public Overrides Function ToString() As String
    32. Return String.Format("{0}, {1}, {2}", Me.A, Me.B, Me.C)
    33. End Function
    34. 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!

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