List(of(T)).find-Methode richtig einsetzen??

  • VB.NET

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

    List(of(T)).find-Methode richtig einsetzen??

    hallo zusammen,

    ich hab schon wieder nen problem. ich habe eine Klasse Auftrag.
    jeder auftrag bekommt ne eigene auftragsnummer.
    diese wird als integer erstellt und in einer combobox mit voranstehenden nullen eingetragen.
    Beispiel:
    A-Nr 1 wird in der combobox zu 00000001
    A-Nr 126 wird in der combobox zu 00000126

    wenn ich nun in der combobox eine A-Nr. auswähle soll das programm mir in einem label die informationen zu diesem auftrag anzeigen.
    wie kann ich nun mit der find-Methode eine list of clsAuftrag durchsuchen, anhand dieser nummer und mir den index wiedergeben lassen?

    besten dank im voraus

    mfg ICE

    EDIT: ach ja ich möchte abe nicht mit ner for schleife das ding durchlaufen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ICEMAN-Wappen“ ()

    Probier mal dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private MyListOf As List(Of Auftrag)
    3. Private MyName As String
    4. Public Sub New()
    5. InitializeComponent()
    6. MyListOf = New List(Of Auftrag)
    7. MyName = Nothing
    8. End Sub
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. MyListOf.Add(New Auftrag(1))
    11. MyListOf.Add(New Auftrag(2))
    12. MyListOf.Add(New Auftrag(3))
    13. End Sub
    14. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    15. Dim aa As Auftrag
    16. MyName = "002"
    17. Dim match As New System.Predicate(Of Auftrag)(AddressOf IsMyIndex)
    18. aa = MyListOf.Find(match)
    19. End Sub
    20. Public Function IsMyIndex(ByVal aa As Auftrag) As Boolean
    21. Return aa.Name.ToLower = MyName.ToLower
    22. End Function
    23. End Class
    24. Public Class Auftrag
    25. Private _Name As String
    26. Public Sub New(ByVal Index As Integer)
    27. _Name = String.Format("{0:000}", Index)
    28. End Sub
    29. Public ReadOnly Property Name() As String
    30. Get
    31. Return _Name
    32. End Get
    33. End Property
    34. End Class
    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!
    Hallo,

    hier meine Art der Lösung.
    Etwas kürzer aber weder besser noch schlechter.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Structure Auftrag
    3. Public Bezeichnung As String
    4. Public Nummer As Integer
    5. Public Sub New(ByVal b As String, ByVal n As Integer)
    6. Bezeichnung = b
    7. Nummer = n
    8. End Sub
    9. End Structure
    10. Private _auftraege As New List(Of Auftrag)
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. _auftraege.Add(New Auftrag("Test", 1))
    13. End Sub
    14. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    15. find_autrag_arg = CInt(Me.TextBox1.Text)
    16. Dim pos As Integer = _auftraege.FindIndex(AddressOf find_auftrag)
    17. If pos > -1 Then
    18. MessageBox.Show("Auftrag an Position " & pos.ToString & "gefunden")
    19. Else
    20. MessageBox.Show("Kein Auftrag gefunden")
    21. End If
    22. End Sub
    23. 'Hier das Suchen
    24. Private find_autrag_arg As Integer
    25. Private Function find_auftrag(ByVal a As Auftrag) As Boolean
    26. If find_autrag_arg = a.Nummer Then
    27. Return True
    28. Else
    29. Return False
    30. End If
    31. End Function
    32. End Class

    Gruss

    mikeb69
    ok erstmal danke euch beiden.

    wenn ich das gelesene jetzt richtig verstanden habe muss ich feststellen, dass ne for-next schleife wohl doch die bessere wahl ist, da ich dort ja nur wenige zeilen brauche. sollte ich dennoch drüber nachdenken eine eurer varianten zu nutzen? ich meine so vom programmiertechnischen her z.b. fehleranfälligkiet o.ä?
    Nun, Du musst das machen, was Dir gefällt.
    Praktisch, schnell, elegant, professionell, pflegbar.
    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!
    Hallo ICEMAN-Wappen,

    schleife geht natürlich auch.

    Die hier vorgestellten Lösungen sind jedoch objektorientierter bzw. moderner, evtl. schneller (kann aber nicht viel sein)
    Der Code ist auch nicht so viel größer als der einer Schleife.

    Bei meinem Beispiel ist das die Suchfunktion.

    VB.NET-Quellcode

    1. 'Hier das Suchen
    2. Private find_autrag_arg As Integer
    3. Private Function find_auftrag(ByVal a As Auftrag) As Boolean
    4. If find_autrag_arg = a.Nummer Then
    5. Return True
    6. Else
    7. Return False
    8. End If
    9. End Function

    Kann auch kürzer geschrieben werden

    VB.NET-Quellcode

    1. 'Hier das Suchen
    2. Private find_autrag_arg As Integer
    3. Private Function find_auftrag(ByVal a As Auftrag) As Boolean
    4. Return find_autrag_arg = a.Nummer
    5. End Function

    und der Aufruf dazu.

    VB.NET-Quellcode

    1. find_autrag_arg = CInt(Me.TextBox1.Text)
    2. Dim pos As Integer = _auftraege.FindIndex(AddressOf find_auftrag)

    Ist eine Schleife viel kürzer ?

    Gruss

    mikeb69
    Wird die ComboBox wo die Aufträge angezeigt werden durch die Klasse Auftrag erstellt?

    Also zumindest würde ich das so machen, dann wären nämlich die Indizies der ComboBox und der List(Of Auftrag) identisch und um an die Klasse zu kommen bräuchte man nur eine Zeile

    VB.NET-Quellcode

    1. Private ComboBox1_SelectedChange(...) Handles ComboBox1.SelectedChange
    2. Dim derAuftrag As Auftrag = Aufträge.Items(ComboBox1.SelectedIndex)
    3. End Sub


    Bzw. noch besser wäre es wenn du die Klasse direkt in die ComboBox lädst

    VB.NET-Quellcode

    1. ComboBox1.Item.Add(New Auftrag("000001", "Kunde", "Max Mustermann"))


    und bei der Aufwahl

    VB.NET-Quellcode

    1. Private ComboBox1_SelectedChange(...) Handles ComboBox1.SelectedChange
    2. Dim derAuftrag As Auftrag = DirectCast(DirectCast(sender, ComboBox).SelectedItem, Auftrag)
    3. End Sub