List (of T) durchsuchen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    List (of T) durchsuchen

    Hallo Zusammen,

    ich habe eine List (of T) einer eigenen Klasse erstellt. Nun möchte ich die Liste nach dem Index bestimmter Eigenschaften durchsuchen. Ein fixes googlen brachte bisher alle möglichen Ansätze (equality comparer?? linq??) für irgendwelche Listen, aber bisher habe ich nichts für mich verständliches gefunden was das Suchen von Klasseneigenschaften angeht.

    Ich bekomme mittel "Autoliste.IndexOf..." nichts formuliert was mich irgendwie ans Ziel bringt und benötige einen kräftigen Stoß in die richtige Richtung.

    Wie komme ich an den Index des gelben Dacias?

    Vielen Dank vorab

    lg


    Die Autoklasse:

    VB.NET-Quellcode

    1. Public Class auto
    2. Private _Marke As String
    3. Public Property Marke() As String
    4. Get
    5. Return _Marke
    6. End Get
    7. Set(ByVal value As String)
    8. _Marke = value
    9. End Set
    10. End Property
    11. Private _Farbe As String
    12. Public Property Farbe() As String
    13. Get
    14. Return _Farbe
    15. End Get
    16. Set(ByVal value As String)
    17. _Farbe = value
    18. End Set
    19. End Property
    20. End Class


    Die List (of Auto)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim AutoListe As New List(Of auto)
    3. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    4. AutoListe.Add(New auto() With {.Marke = "Dacia", .Farbe = "blau"})
    5. AutoListe.Add(New auto() With {.Marke = "BMW", .Farbe = "schwarz"})
    6. AutoListe.Add(New auto() With {.Marke = "Dacia", .Farbe = "gelb"})
    7. End Sub
    8. End Class
    So in etwa. LINQ ist bei solchen Abfragen ne große Hilfe...

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim result = From c As auto In AutoListe Where c.Marke = "Dacia" AndAlso c.Farbe = "gelb" Select c
    3. If result.Count = 1 Then
    4. Dim i As Integer = AutoListe.IndexOf(result(0))
    5. MessageBox.Show("Index of" & result(0).Marke & " " & result(0).Farbe & " = " & i.ToString())
    6. Else
    7. If result.Count = 0 Then
    8. MessageBox.Show("Keine Treffer")
    9. Else
    10. MessageBox.Show("Suche ergabe mehrere Treffer.")
    11. End If
    12. End If
    13. End Sub
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SpaceyX“ ()

    Tja - Linq wird oft sehr überbewertet, und List(Of T) ist ebensooft unzureichend bekannt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim i = AutoListe.FindIndex(Function(c) c.Marke = "Dacia" AndAlso c.Farbe = "gelb")
    3. End Sub
    Also immer immer erst im ObjectBrowser nachgugge - egal, welche Klasse man wie zu verwenden gedenkt.
    Und grade List(Of T) gehört mit zum genialsten des gesamten Frameworks - die darf man sich auch zig mal immer wieder neu angugge.

    also ist hier nicht so rasend wichtig, aber .FindIndex ist wesentlich performanter, weil die Auflistung nur einmal durchlaufen wird, und auch nur bis zum ersten Treffer.

    Hingegen das Linq-basierte Teil wird mehrmals durchlaufen, und auch noch vollständig.
    Jo. Da hast recht. Immer wieder lernt man was besseres. Ist halt oft auch ein bisschen verwirrend, da es viele Möglichkeiten gibt, die zum Ziel führen. Und immer alle Möglichkeiten parat zu haben ist, naja, oft noch mehr verwirrend.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o