LINQ Summe aus Werten von Objekten innerhalb einer List(Of Object)

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

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Khartak.

    LINQ Summe aus Werten von Objekten innerhalb einer List(Of Object)

    Hallo,

    ich habe schon viel mit LINQ umgesetzt - scheinbar noch nicht genug - denn eine Sache bekomme ich nicht hin.
    Ich habe eine Liste von einem Objekt was ebenfalls jeweils eine weitere Liste mit weiteren Objekten enthält.
    Dort drin befinden sich Werte die ich summieren möchte.

    Werte aus Objekten in einfachen Listen kann ich summieren. Aber die zusätzliche Stufe bekomme ich nicht hin. Ich habe dafür mal ein exemplarisches Konstruk aufgestellt damit es jeder der es versteht nachvollziehen kann was ich vorhabe.

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim ORDERLIST As New List(Of Order) From {New Order With {
    4. .ID = 1, .Name = "Bestellung 1", .PosList = New List(Of Order.Positions) From {
    5. New Order.Positions With {.VarID = 1001, .Amount = 5},
    6. New Order.Positions With {.VarID = 1002, .Amount = 10},
    7. New Order.Positions With {.VarID = 1003, .Amount = 20}}},
    8. New Order With {
    9. .ID = 2, .Name = "Bestellung 2", .PosList = New List(Of Order.Positions) From {
    10. New Order.Positions With {.VarID = 1001, .Amount = 10},
    11. New Order.Positions With {.VarID = 1002, .Amount = 15},
    12. New Order.Positions With {.VarID = 9999, .Amount = 10}}},
    13. New Order With {
    14. .ID = 3, .Name = "Bestellung 3", .PosList = New List(Of Order.Positions) From {
    15. New Order.Positions With {.VarID = 1001, .Amount = 5},
    16. New Order.Positions With {.VarID = 1002, .Amount = 5},
    17. New Order.Positions With {.VarID = 1003, .Amount = 10}}}}
    18. 'Wäre diese PosList nicht innerhalb der ORDERLIST, würde ich mit dieser Anweisung die Werte summieren:
    19. 'PosList.Where(Function(x) x.VarID = 1001).Sum(Function(x) x.Amount)
    20. 'Das hier funktioniert leider nicht bzw. ich komme nicht auf die Properties innerhalb der PosList
    21. Dim SummeVarID_1001 As Integer = ORDERLIST.Select(Function(x) x.PosList).Where( 'hier hörts auf
    22. End Sub
    23. Public Class Order
    24. Public Property ID As Integer
    25. Public Property Name As String
    26. Public Property PosList As List(Of Positions)
    27. Public Class Positions
    28. Public Property VarID As Integer
    29. Public Property Amount As Integer
    30. End Class
    31. End Class
    32. End Module


    Am Ende sollen halt alle Werte (Amount) von der VarID 1001 summiert werden.

    NACHTRAG: Ich habe es hinbekommen. SelectMany musste ich nehmen:

    VB.NET-Quellcode

    1. Dim SummeVarID_1001 As Integer = ORDERLIST.SelectMany(Function(a) a.PosList).Where(Function(x) x.VarID = 1001).Sum(Function(x) x.Amount)


    Jetzt geht es aber weiter. Nun möchte ich ein Ergebnis mit einer Liste vom Typ Order in welchen die VarID 1003 vorkommt. Das wäre ja ID 1 und ID 3.
    Mit dieser Funktion bekomme ich aber nur die Liste vom Typ Order.Positions zurück:

    VB.NET-Quellcode

    1. ​Dim SEARCH_OL = ORDERLIST.SelectMany(Function(a) a.PosList).Where(Function(x) x.VarID = 1003)


    Eine Idee? :D

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Khartak“ ()

    statt .Count > 0 kann man auch .Any verwenden.

    VB.NET-Quellcode

    1. Dim SEARCH_OL = ORDERLIST.Where(Function(x) x.PosList.Any(Function(y) y.VarID = 1003)) 'ggf .ToList

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.