Item zu verschachtelter List (Of) hinzufügen

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

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

    Item zu verschachtelter List (Of) hinzufügen

    Hallo,

    ich habe verschachtelte eine List (Of KATEGORIE) folgender Klasse:

    VB.NET-Quellcode

    1. Class KATEGORIE
    2. Private _ID As Integer
    3. Public Property ID As Integer
    4. Get
    5. Return _ID
    6. End Get
    7. Set(ByVal value As Integer)
    8. _ID = value
    9. End Set
    10. End Property
    11. Private _SNAME As String
    12. Public Property SNAME As String
    13. Get
    14. Return _SNAME
    15. End Get
    16. Set(ByVal value As String)
    17. _SNAME = value
    18. End Set
    19. End Property
    20. Private _Children As List(Of KATEGORIE)
    21. Public Property Children() As List(Of KATEGORIE)
    22. Get
    23. Return _Children
    24. End Get
    25. Set(ByVal value As List(Of KATEGORIE))
    26. _Children = value
    27. End Set
    28. End Property
    29. End Class


    Zu dieser List möchte ich nun ein Item als Child eines bestimmten Items hinzufügen.
    Ich habe leider überhaupt keine Idee wie ich ansetzen soll. ?(
    Kennt jemand eine Lösung meines Problems?
    Danke im Voraus!
    Hallo

    Da gibt es viele Möglichkeiten.

    Z.b.

    VB.NET-Quellcode

    1. Dim cat As New KATEGORIE() With {.Children = New List(Of KATEGORIE)() From {New KATEGORIE() With {.ID = 1, .SNAME = "Name"}}}


    oder

    VB.NET-Quellcode

    1. Dim subCat1 As New KATEGORIE() With {.ID = 1, .SNAME = "Name"}
    2. Dim cat As New KATEGORIE() With {.Children = New List(Of KATEGORIE)}
    3. cat.Children.Add(subCat1)


    Wenn du einen Subeintrag suchst dann z.b.:

    VB.NET-Quellcode

    1. Dim cat As New KATEGORIE() With {.Children = New List(Of KATEGORIE)() From {New KATEGORIE() With {.ID = 1, .SNAME = "Name"}}}
    2. Dim subCat1 As New KATEGORIE() With {.ID = 2, .SNAME = "Name"}
    3. cat.Children.Where(Function(c) c.ID = 1).First.Children.Add(subCat1)



    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Okay danke!

    Und wenn ich jetzt wie folgt vorgehen würde?

    VB.NET-Quellcode

    1. Dim ListKategorie As New List(Of KATEGORIE)
    2. Dim cat1 As New KATEGORIE() With {.Children = New List(Of KATEGORIE)() From {New KATEGORIE() With {.ID = 1, .SNAME = "Name1"}}}
    3. Dim subCat1 As New KATEGORIE With {.ID = 2, .SNAME = "Name2"}
    4. Dim cat2 As New KATEGORIE() With {.Children = New List(Of KATEGORIE)() From {New KATEGORIE() With {.ID = 3, .SNAME = "Name3"}}}
    5. Dim subCat2 As New KATEGORIE With {.ID = 4, .SNAME = "Name4"}
    6. ListKategorie.Add(cat1)
    7. ListKategorie.Add(cat2)


    Und ich beim Item mit der ID 2 ein Child innerhalb der ListKategorie hinzufügen möchte?
    Was?

    Der Code ergibt aber wenig Sinn?
    subCat1 und subCat2 wird nie irgendwo hinzugefügt!!

    Also wie willst du in der Auflistung etwas mit einer ID = 2 finden wenn du es nicht hinzufügst??

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Entschuldige, erst denken dann schreiben :thumbsup:

    VB.NET-Quellcode

    1. Dim ListKategorie As New List(Of KATEGORIE)
    2. Dim cat1 As New KATEGORIE() With {.ID = 1, .CNAME = "NAME1"}
    3. Dim subCat1 As New KATEGORIE With {.ID = 2, .CNAME = "Name2"}
    4. Dim subCat2 As New KATEGORIE With {.ID = 3, .CNAME = "Name3"}
    5. cat1.Children.Add(subCat1)
    6. cat1.Children.Add(subCat2)
    7. Dim cat2 As New KATEGORIE() With {.ID = 4, .CNAME = "NAME4"}
    8. Dim subCat3 As New KATEGORIE With {.ID = 5, .CNAME = "Name5"}
    9. cat2.Children.Add(subCat3)
    10. ListKategorie.Add(cat1)
    11. ListKategorie.Add(cat2)


    Nehmen wir mal an, ich möchte noch weitere Children beim SubCat2 hinzufügen.
    Hallo

    also erstmal würde der Code von dir so nicht laufen...

    VB.NET-Quellcode

    1. Dim ListKategorie As New List(Of KATEGORIE)
    2. Dim cat1 As New KATEGORIE() With {.ID = 1, .CNAME = "NAME1", .Children = New List(Of KATEGORIE)}
    3. Dim subCat1 As New KATEGORIE With {.ID = 2, .CNAME = "Name2", .Children = New List(Of KATEGORIE)}
    4. Dim subCat2 As New KATEGORIE With {.ID = 3, .CNAME = "Name3", .Children = New List(Of KATEGORIE)}
    5. cat1.Children.Add(subCat1)
    6. cat1.Children.Add(subCat2)
    7. Dim cat2 As New KATEGORIE() With {.ID = 4, .CNAME = "NAME4", .Children = New List(Of KATEGORIE)}
    8. Dim subCat3 As New KATEGORIE With {.ID = 5, .CNAME = "Name5", .Children = New List(Of KATEGORIE)}
    9. cat2.Children.Add(subCat3)
    10. ListKategorie.Add(cat1)
    11. ListKategorie.Add(cat2)


    Es gibt viele möglichkeiten. Je nachdem WO du den code aufrfst und ob du an der Stelle noch zugriff auf die Objekte hast.

    VB.NET-Quellcode

    1. 'Weiter Children dem subcat2 hinzufügen
    2. subCat2.Children.Add(New KATEGORIE() With {.CNAME = "Neuer Name", .ID = 6})
    3. 'ODER über den Parent
    4. cat1.Children.Where(Function(s) s.ID = 3).First.Children.Add(New KATEGORIE() With {.CNAME = "Neuer Name", .ID = 6})


    Für das suchen würde ich mir eine Methode schreiben welche sich selbst immer aufruft. (Rekursive Methode)

    VB.NET-Quellcode

    1. Private Function SearchChild(searchId As Integer, searchobject As KATEGORIE) As KATEGORIE
    2. For Each cat In searchobject.Children
    3. If cat.ID = searchId Then Return cat
    4. If cat.Children IsNot Nothing Then SearchChild(searchId, cat)
    5. If SearchResult IsNot Nothing Then Exit For
    6. Next
    7. Return Nothing
    8. End Function


    Anwendung dann z.b. so.

    VB.NET-Quellcode

    1. Dim SearchResult As KATEGORIE
    2. Dim idForsearch As Integer = 5
    3. If Not ListKategorie.Where(Function(c) c.ID = idForsearch).Any Then
    4. For Each c In ListKategorie
    5. SearchResult = SearchChild(idForsearch, c)
    6. Next
    7. Else
    8. SearchResult = ListKategorie.Where(Function(c) c.ID = idForsearch).First
    9. End If
    10. MessageBox.Show(SearchResult.CNAME)


    Das geht zwar noch eleganter, wollte aber jetzt nicht allzu komplizierten code einwerfen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Danke deine Antwort war mir schon sehr hilfreich!
    Ich habe nur ein Problem: Wenn ich deine beschriebene Funktion teste, findet er nur Ergebnisse, wenn ich die obersten beiden Hierachiestufen suche.
    Ich habe jedoch beliebig viele Hierachiestufen.

    Es "knallt" ist keine Fehlerbeschreibung welche man in einem Programmiererforum erwarten kann oder?

    Ausserdem wäre gut wenn du zeigst wie du es implementiert hast.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##