Lambda Ausdruck -> Teilergebnis mit Bedingung zurückgeben

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Lambda Ausdruck -> Teilergebnis mit Bedingung zurückgeben

    Hallo zusammen,

    ich versuche gerade eine Abfrage zu erstellen mit der ich eine Liste zurückbekomme mit bestimmten Werten aus dessen eingebetteten Objekten die selber Listen haben. Schwer zu erklären daher hier ein Beispielcode:

    VB.NET-Quellcode

    1. Public Class Daten
    2. Public Property ID As Integer
    3. Public Property PosList As List(Of Positionen)
    4. Public Class Positionen
    5. Public Property WertA As Integer
    6. Public Property TestX As String
    7. End Class
    8. End Class


    Ich habe jetzt eine Liste vorliegen vom Typ Daten:

    VB.NET-Quellcode

    1. Dim MeineDaten As New List(Of Daten)


    Ich möchte eine neue Liste die nur Objekte enthält dessen PosList jeweils den Wert "WertA " > 0 hat.

    Ich fing an mit:

    VB.NET-Quellcode

    1. Dim Result = MeineDaten.SelectMany(Function(a) a.PosList).Where(Function(b) b.WertA > 0)

    Aber das gibt mir ja nur eine Liste von Positionen zurück. Ich brauche aber die Liste vom Typ "Daten" mit den Positionen die auf die Bedingung zutreffen.

    Kann mir da jemand bitte helfen?

    NACHTRAG: Ich behelfe mir vorerst mal mit einer For Schleife und speichere die Daten auf welche die Bedingung zutrifft neu ab. Ich befürchte eine Lambda/LINQ Lösung wird da schwierig.

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

    Wieviel Datensätze enthält den die Variable PosList
    Das ist eine Frage die geklärt werden soll.

    Wenn nur eine drin ist dann ist es einfach aber sind es mehr dann solltest du eventuell dir die Vorgehensweise überlegen

    Eventuell suchst du das hier

    VB.NET-Quellcode

    1. ​Dim Result = meinedaten.Select(Function(a) a.PosList.Where(Function(b) b.WertA > 0))


    Freundliche Grüsse

    exc-jdbi

    ErfinderDesRades schrieb:

    Wenn du deinen Schleifen-Code zeigst, dann kann man daraus vielleicht eine Linq-Query ableiten.
    Oder halt ersehen, dasses mit Linq tatsächlich nicht geht.


    VB.NET-Quellcode

    1. For Each a In MeineDaten
    2. For Each b In a.PosList
    3. If b.WertA > 0 Then
    4. 'Bedingung erfüllt -> Übertrage Werte aus a und b in neues Ziel bzw. in ein neues Objekt vom Typ List(Of Daten)
    5. End If
    6. Next
    7. Next
    @Khartak

    Ich finde das eine gute Lösung.

    Ich hätte das auch nicht viel anders gemacht. Irgendwie so.

    VB.NET-Quellcode

    1. Dim result = New List(Of Daten)
    2. Array.ForEach(meinedaten.Select(Function(a) SeparateData(a)).ToArray, Sub(x) result.AddRange(x))


    VB.NET-Quellcode

    1. Private Function SeparateData(daten As Daten) As IEnumerable(Of Daten)
    2. Return daten.PosList.Where(Function(b) b.WertA > 0).Select(Function(p) New Daten With {.ID = daten.ID, .PosList = New List(Of Daten.Positionen) From {p}})
    3. End Function


    Oder einfach so.

    VB.NET-Quellcode

    1. ​Dim result = meinedaten.SelectMany(Function(a) SeparateData(a)).ToList


    Edit:
    Umwandlung der Funktion SeparateData in IEnumerable(Of Daten)

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Ich denke, das ginge so:

    VB.NET-Quellcode

    1. 'For Each a In MeineDaten
    2. ' For Each b In a.PosList
    3. ' If b.WertA > 0 Then
    4. ' 'Bedingung erfüllt -> Übertrage Werte aus a und b in neues Ziel bzw. in ein neues Objekt vom Typ List(Of Daten)
    5. ' End If
    6. ' Next
    7. 'Next
    8. ' -----------------------------------------
    9. Dim ziel = MeineDaten.SelectMany(Function(x) x.PosList).Where(Function(x) x.WertA > 0).Tolist
    ungetestet
    So bekomme ich leider nur die Liste vom Typ Positionen zurück.



    Ich habe es gefunden und es ist so einfach:

    Stichwort ANY

    VB.NET-Quellcode

    1. MeineDaten.Where(Function(a) a.PosList.Any(Function(b) b.WertA > 0))


    Leider muss ich trotzdem noch eine For Schleife durchlaufen lassen, denn mir werden halt alle Listeneinträge zurückgegeben, auch die, auf welche die Bedingung nicht zutrifft.

    Danke trotzdem.

    Beiträge zusammengefügt. ~Thunderbolt

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

    Ok, Du bekommst mit Deinem letzten Code alle MeineDaten-Sätze, bei denen bei mindestens ein PosList-Eintrag der WertA größer 0 ist. Nun sagst Du, dass es auch Datensätze mit sich bringt, die diese Bedingung nicht erfüllen. Ist das richtig zusammengefasst oder meinst Du was anderes? Welche Datensätze erwartest Du stattdessen? Am besten Beispieldaten posten.
    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.