linq Abfrage aus list of structure - Index des Maximalwertes

  • VB.NET

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

    linq Abfrage aus list of structure - Index des Maximalwertes

    Hallo Forum,

    Ich bin schon länger Mitleser und habe schon viele Antworten hier gefunden - Super Forum!

    Jetzt stehe ich vor einem Problem bzw. auf dem Schlauch. Ich erstelle dynamisch eine list einer Struktur und hole dann jeweils den kleinsten und den größten Wert von "byte_nr" über linq.
    Wie kann ich einen weiteren Wert "type" des größten Wertes von "byte_nr" erhalten?
    Irgendwie komme ich nicht drauf...

    VB.NET-Quellcode

    1. Public Structure WorkData
    2. Public handle As Integer
    3. Public db_nr As Integer
    4. Public byte_nr As Integer
    5. Public bit_nr As Integer
    6. Public type As var_type
    7. Public dev As Integer
    8. Public db As Integer
    9. Public bc As Integer
    10. Public value As Double
    11. Public changed As Boolean
    12. End Structure
    13. Dim IndexList As New List(Of WorkData)
    14. Dim Cmd = From item In IndexList
    15. Group item By item.handle, item.db_nr Into g = Group
    16. Let minByte = g.Min(Function(p As WorkData) p.byte_nr)
    17. Let maxByte = g.Max(Function(p As WorkData) p.byte_nr)
    18. Let maxEntry = g.Max(Function(max As WorkData) max.type) 'funktioniert so natürlich nicht, ich erhalte den größten Wert von type aus der Gruppe


    Danke an euch :)
    Willkommen im Forum. :thumbup:
    Definiere

    Boesling schrieb:

    des größten Wertes von "byte_nr"
    Mach mal 3 Zahlenbeispiele, damit wir verstehen, was konkret Du meinst.
    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!
    OK, ich hoffe das erklärt es.
    Gesucht ist der Wert "type" vom Ergebnis max aus "byte_nr"

    {handle, db_nr, byte_nr, bit_nr, type, dev, db, bc, value, changed}
    {0,110,5,0,3,1,1,1,0.0,true}
    {0,110,3,0,5,1,1,1,0.0,true}
    {0,110,4,0,1,1,1,1,0.0,true}

    Ergebnis: minByte = 3, maxByte = 5, maxEntry = 3

    {handle, db_nr, byte_nr, bit_nr, type, dev, db, bc, value, changed}
    {0,110,0,0,3,1,1,1,0.0,true}
    {0,110,1,0,5,1,1,1,0.0,true}
    {0,110,2,0,1,1,1,1,0.0,true}

    Ergebnis: minByte = 0, maxByte = 2, maxEntry = 1


    Dank euch.
    Hier mal ein kleines Beispiel Consoleprogramm welche es veranschaulichen sollte:
    Hoffe habe dich richtig verstanden.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim lst As New List(Of WorkData)()
    4. Dim w1 As New WorkData() With {.byte_nr = 1, .type = var_type.Eins}
    5. Dim w2 As New WorkData() With {.byte_nr = 3, .type = var_type.Eins}
    6. Dim w3 As New WorkData() With {.byte_nr = 5, .type = var_type.Eins}
    7. Dim w4 As New WorkData() With {.byte_nr = 2, .type = var_type.Zwei}
    8. Dim w5 As New WorkData() With {.byte_nr = 3, .type = var_type.Zwei}
    9. Dim w6 As New WorkData() With {.byte_nr = 4, .type = var_type.Zwei}
    10. Dim w7 As New WorkData() With {.byte_nr = 20, .type = var_type.Drei}
    11. Dim w8 As New WorkData() With {.byte_nr = 30, .type = var_type.Drei}
    12. Dim w9 As New WorkData() With {.byte_nr = 100, .type = var_type.Drei}
    13. lst.Add(w1)
    14. lst.Add(w2)
    15. lst.Add(w3)
    16. lst.Add(w4)
    17. lst.Add(w5)
    18. lst.Add(w6)
    19. lst.Add(w7)
    20. lst.Add(w8)
    21. lst.Add(w9)
    22. Dim query = From l In lst
    23. Group By l.type Into
    24. m1 = Min(l.byte_nr),
    25. m2 = Max(l.byte_nr)
    26. For Each item In query
    27. Console.WriteLine("Type {0}, Min {1}, Max {2}", item.type.ToString(), item.m1, item.m2)
    28. Next
    29. Console.Read()
    30. End Sub
    31. End Module
    32. Public Enum var_type
    33. Eins
    34. Zwei
    35. Drei
    36. End Enum
    37. Public Structure WorkData
    38. Public byte_nr As Integer
    39. Public type As var_type
    40. End Structure



    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    Boesling schrieb:

    Irgendwie komme ich nicht drauf...
    Kein Wunder, denn Linq hat da nicht wirklich was für vorgesehen.

    Ich hab eine Linq-Extension geschrieben, mit der bekommst du die Workerstrukt, die die größte byte_nr hat - type kannste dann ja davon abrufen: verbesserte AggregatFunktion für Linq-Max / Linq-Min

    Boesling schrieb:

    der Wert "type"
    ist vom Typ var_type, der ist hier noch nicht eingeführt worden, wahrscheinlich ist das ein Enum.
    Vorschlag, womit das ganze besser gehen dürfte:
    Pack Deine Werte, die vom Typ Integer sind, in ein Array und greif dann per Index auf die zu. Wenn Du dem Index noch ein (anderes) Enum zuordnest, kannst Du per Enum-Namen drauf zu greifen.
    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 habe beide Ansätze probiert und natürlich funktionieren beide :)
    Verwenden werde ich die Lösung vom ErfinderdesRades, da diese allgemeingültig funktioniert.

    Danke euch - u r the best

    @Rod: stimmt, "type" ist ein enum, mit der Lösung vom Erfinder kann ich mir aber die Umstrukturierung der Daten sparen - Trotzdem Danke.