Liste nach Strings durchsuchen und gefundene Indexes in weiterer Liste speichern

  • VB.NET

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Liste nach Strings durchsuchen und gefundene Indexes in weiterer Liste speichern

    Hi und schönen 4. Advent zusammen,

    Ich habe eine Liste mit Strings (Private Namenliste As New List (Of String)). Diese enthält eine Menge Einträge, (auch doppelte!)

    Nun will ich, dass mir das Programm in dieser Liste Namenliste nach Strings sucht, und alle gefundenen Indexes in einer weiteren Liste (Private Zeiger As New List (Of Integer) speichert.

    Im Internet gefunden hab ich bloss das hier:

    Private Zeiger As Integer = Namenliste(IndexOf("Gesuchter String"))

    Aber damit kann man ja wie es aussieht nur einzelne Indexes abrufen...
    @kafffee Selber einen schönen 4. Advent.
    Was genau willst Du damit erreichen?
    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!
    @RodFromGermany

    Ich bin dabei ein Programm für die Verwaltung meiner MP3s zu schreiben.

    Gegeben hab ich drei Listen (keine Listboxes!) (für jede Datei ein Element), die die Metadaten der MP3s enthalten. Diese haben also alle die gleiche Grösse, das heisst ich könnte jede Datei bzw. jeden "Datensatz" über einen einheitlichen Index ansprechen.

    listAlleInterpreten
    listAlleAlben
    listAlleMusiktitel

    Nun soll, wenn ich etwas in eine Textbox eingebe, die listAlleInterpreten durchsucht werden nach TextBox1.Text Und zwar dass wenn ich also "Michael Jackson" eingebe, in einer Listbox alle seine Alben und in einer weiteren Listbox alle seine Titel angezeigt werden.

    Diese Alben und Musiktitel will ich ermitteln, indem ich die Indexes anspreche, die ich mit

    Private Zeiger As Integer = listAlleINterpreten(IndexOf("Michael Jackson"))

    ermittelt hab, aber das würde ja nur für ein Element funktionieren.

    Ist bisschen schwer zu beschreiben, ich hoffe ich hab das anschaulich erklärt...

    @Dksksm
    Ja gut danke für den Ansatz, aber da Michael Jackson wohl mehr als ein Album/Musiktitel hat funktioniert das nicht (vorausgesetzt ich versteh das richtig). Es sollen daher ja auch doppelte Einträge gefunden werden...

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

    @kafffee Suboptimal.
    Habe eine Liste mit Instanzen einer Struktur Klasse, die alle Daten als Properties beinhaltet und eine Suchfunktion, der Du den Eintrag (das Property) und mögliche Randwerte übergibst.
    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!

    kafffee schrieb:


    Es sollen daher ja auch doppelte Einträge gefunden werden...


    Erstens mal war von der wirklichen Aufgabenstellung in deinem Ausgangspost gar nichts zu lesen und zweitens werden doppelte Einträge gefunden. Als Index kann es über die Funktion .IndexOf aber nur auf den ersten Treffer matchen. Wenn du es komplexer willst, dann darfst du halt nicht von Anfang an durchsuchen. Gehen tut alles. Aber ich denke, dass @RodFromGermany hier den sinnvollsten Vorschlag bereits gemacht hat.

    kafffee schrieb:

    listAlleInterpreten
    listAlleAlben
    listAlleMusiktitel
    Herzlichen Glückwunsch!
    Du näherst dich mit Riesen-Schritten der relationalen Datenverarbeitung.
    Interpret, Album Musiktitel - das sind Entitäten, und es ist genau richtig, alle Instanzen einer Entität in eine Liste zu packen.
    Nur in der relationalen Datenverarbeitung heissen solche Listen Tabellen.
    Und es gibt auch spezialisierte Klassen dafür, weil List(Of T) kann was als nächstes kommt nicht mehr modellieren:
    Zwischen den Entitäten bestehen Relationen, etwa ein Interpret hat an vielen MusikTiteln mitgewirkt.
    Vermutlich ists noch komplexer: An einem Musiktitel können ja auch mehrere Interpreten mitwirken - oder willst du das nicht modellieren?
    Ein Album enthält viele Musiktitel.
    Aber vielleicht willst du auch modellieren, dass mehrere verschiedene Alben evtl denselben Musiktitel beinhalten. Evtl. gar von verschiedenen Interpreten?
    Und ein Interpret wirkt an vielen Alben mit, und an einem Album haben viele Interpreten mitgewirkt.
    Und dann kommt noch das Theater mit den Genres hinzu...

    Wie dem auch sei: Mit List(Of T) (hierarchische Datenverarbeitung, im besten Falle) ist das in dieser Komplexität nicht mehr zu bewältigen - es wird schon bei relationaler Datenverarbeitung knifflig genug.
    Gugge Grundlagen: Relationale Datenmodellierung für die Theorie, und die vier Views auf Video für die Praxis.
    @Dksksm
    Hat vielleicht so geklungen aber war nicht bös gemeint.

    @RodFromGermany
    Meinst du in etwa so (zumindest für den Anfang)? Oder denke ich da in die falsche Richtung?

    VB.NET-Quellcode

    1. Public Class ClassMP3Datei
    2. Public Property Interpret As String
    3. Get
    4. Return Form1.listAlleInterpreten(0)
    5. End Get
    6. Set(value As String)
    7. End Set
    8. End Property
    9. Public Property Album As String
    10. Get
    11. Return Form1.listAlleAlben(0)
    12. End Get
    13. Set(value As String)
    14. End Set
    15. End Property
    16. Public Property Musiktitel As String
    17. Get
    18. Return Form1.listAlleMusiktitel(0)
    19. End Get
    20. Set(value As String)
    21. End Set
    22. End Property
    23. End Class
    24. Public Class Form1
    25. Public Zeiger As New List(Of ClassMP3Datei)
    26. Public listAlleInterpreten As New List(Of String)
    27. Public listAlleAlben As New List(Of String)
    28. Public listAlleMusiktitel As New List(Of String)
    29. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    30. listAlleInterpreten.Add("Michael JAckson")
    31. listAlleAlben.Add("HIStory")
    32. listAlleMusiktitel.Add("Thriller")
    33. End Sub
    34. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    35. ListBox1.Items.Add(Zeiger(0).Interpret)
    36. ListBox1.Items.Add(Zeiger(0).Album)
    37. ListBox1.Items.Add(Zeiger(0).Musiktitel)
    38. End Sub
    39. End Class

    kafffee schrieb:

    Meinst du in etwa so
    Eher so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Content As List(Of MP3Datei)
    3. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    4. Content = New List(Of MP3Datei)
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Dim mp3 = New MP3Datei("Michael Jackson", "HIStory", "Thriller")
    8. Me.LContent.Add(mp3)
    9. Me.ListBox1.Items.Add(mp3)
    10. End Sub
    11. End Class
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class MP3Datei
    2. Public Property Interpret As String
    3. Public Property Album As String
    4. Public Property Musiktitel As String
    5. Public Sub New(Inter As String, Alb As String, titel As String)
    6. Me.Interpret = Inter
    7. Me.Album = Alb
    8. Me.Musiktitel = titel
    9. End Sub
    10. Public Overrides Function ToString() As String
    11. Return String.Format("{0} - {1} - {2}", Me.Interpret, Me.Album, Me.Musiktitel)
    12. End Function
    13. 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!
    @kafffee Ich denke mal, dass bei Dir Zeiger.Count = 0 ist, dass Deine Liste keine Elemente enthält.

    Lerne zu debuggen:
    Debuggen, Fehler finden und beseitigen
    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!

    RodFromGermany schrieb:

    Habe eine Liste mit Instanzen einer Struktur Klasse, die alle Daten als Properties beinhaltet und eine Suchfunktion, der Du den Eintrag (das Property) und mögliche Randwerte übergibst.


    Kannst du das ein bisschen ausführlicher beschreiben, ich versuche schon seit zwei Stunden dahinter zu kommen aber ich komm auf keinen grünen Zweig..
    Gezielter fragen.
    Habe eine Liste mit Instanzen einer Struktur Klasse, die alle Daten als Properties beinhaltet und eine Suchfunktion, der Du den Eintrag (das Property) und mögliche Randwerte übergibst.

    Der Satz enthält viele Fachbegriffe:
    1. Instanzen
    2. Struktur (vermutlich irrelevant, da durchgestrichen)
    3. Klasse
    4. Daten
    5. Properties
    6. Suchfunktion
    7. Eintrag
    8. Randwerte
    Welche dieser Worte sind unklar?



    Man kanns auch in zwei Sätze aufteilen - welcher Satz ist unverständlich?
    1. Habe eine Liste mit Instanzen einer Struktur Klasse, die alle Daten als Properties beinhaltet
    2. Habe eine Suchfunktion, der Du den Eintrag (das Property) und mögliche Randwerte übergibst.

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Private Content As List(Of MP3Datei)
    Und dann so was:

    VB.NET-Quellcode

    1. For Each mp3 in Content
    2. ' was mit mp3 tun, z.B.:
    3. Console.WriteLine(mp3.ToString)
    4. Next
    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!
    @RodFromGermany

    Ich hab mir das in etwa so vorgestellt:

    VB.NET-Quellcode

    1. Private Content As List(Of MP3Datei)
    2. Private listIndex As List (Of Integer)
    3. 'Die gesamte Liste meiner Interpreten in die Property "Interpret" schreiben
    4. For i = 0 To listInterpreten.Count()
    5. Content(i).Index.Add(i)
    6. Content(i).Interpret.Add(listInterpreten(i))
    7. Next
    8. 'Dann natürlich das gleiche für die Alben und Musiktitel
    9. '[...] Dann
    10. For Each Textbox1.Text in Content.Interpret
    11. listIndex.Add(Content.Index)
    12. Next
    13. 'Dann mit Hilfe der Einträge in listIndex() die Alben und Musiktitel des gesuchten Interpreten (Eingabe in Text1) finden und in eine Listbox packen...


    Weisst du wie ich meine? Lies dir dazu nochmal mein Post #4 durch...
    ich vermute, er weiss so ungefähr, was du meinst. Und meint, das sei aber keine gute Idee.
    Eine bessere Idee wäre, du würdest eine Suchfunktion schreiben, die deine Content-Liste durchgeht, und dann gleich "die Alben und Musiktitel des gesuchten Interpreten (Eingabe in Text1) finden und in eine Listbox packen..." tut.
    Rumhampeln mit einem listIndex()-Dingens kann man sich sparen.

    kafffee schrieb:

    'Die gesamte Liste meiner Interpreten in die Property "Interpret" schreiben
    Verstehe zunächst den Code in Post #9.
    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!
    @RodFromGermany
    Ja da ist wirklich so einiges, was ich nicht verstehe. Ich hab dir das mal auskommentiert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Content As List(Of MP3Datei) 'Kann man das und Zeile 4 nicht auch zusammenfassen?
    3. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    4. Content = New List(Of MP3Datei)
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Dim mp3 = New MP3Datei("Michael Jackson", "HIStory", "Thriller") 'ich hab so um die 3k Datensätze, die in der Anzahl variieren Da kann ich nicht für jeden Datensatz eine Variable anlegen. Soltte ich da nicht gleich eine Liste nehmen?
    8. Me.LContent.Add(mp3) 'kann man das "Me."auch nicht weglassen? Warum schreibst du das mit rein?
    9. Me.ListBox1.Items.Add(mp3)
    10. End Sub
    11. End Class
    12. Public Class MP3Datei
    13. Public Property Interpret As String 'das ist klar, Deklarieren der Properties
    14. Public Property Album As String
    15. Public Property Musiktitel As String
    16. Public Sub New(Inter As String, Alb As String, titel As String) 'Warum der Umweg über eine Methode,
    17. 'hat das was mit Zeile 8 zu tun? Wird die da aufgerufen? Ich hatte gedacht Methoden ruft man auf über
    18. 'MeineKlasse.MeineMethode()?? Geht das nicht mit Get und Set wie in meinem Post #8?
    19. Me.Interpret = Inter
    20. Me.Album = Alb
    21. Me.Musiktitel = titel
    22. End Sub
    23. Public Overrides Function ToString() As String 'das hier ist glaube ich nur eine Hilfsfunktion? Aber die wird doch von nirgends aufgerufen??
    24. Return String.Format("{0} - {1} - {2}", Me.Interpret, Me.Album, Me.Musiktitel)
    25. End Function
    26. End Class
    @kafffee
    'Kann man das und Zeile 4 nicht auch zusammenfassen?
    Deklaration und Instanziierung sind besser getrennt. Ich habe bewusst nicht Form_Load genommen, weil Exceptions da nicht hochgereicht werden.
    'ich hab so um die 3k Datensätze, die in der Anzahl variieren Da kann ich nicht für jeden Datensatz eine Variable anlegen.
    Sollte ich da nicht gleich eine Liste nehmen?
    Das ist eine Liste.
    'kann man das "Me."auch nicht weglassen? Warum schreibst du das mit rein?
    Gewohnheitssache, Geschmackssache.
    'Warum der Umweg über eine Methode,
    Das ist keine Methode, das ist der Konstruktor.
    'das hier ist glaube ich nur eine Hilfsfunktion? Aber die wird doch von nirgends aufgerufen??
    Das wird in der ListBox angezeigt.
    ====
    Geht das nicht mit Get und Set wie in meinem Post #8?
    Füge noch einen parameterlosen Konstruktor hinzu, dann geht das auch wie in Deinem Post #8:

    VB.NET-Quellcode

    1. Public Sub New()
    2. End Sub

    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!