List of durchsuchen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    List of durchsuchen

    Hi,

    ich versuche gerade eine List (Of T) einer selbst erstelleten Struktur zu durchsuchen und einen eventuell gefundenen Index des gefunden Eintrages zurück zugeben, aber ich weis nicht genau wie ich das lösen kann.

    also, hier mal mein ansatz :

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Public Class Form1
    4. Dim VZInfo As New List(Of VerzeichnisInfo)
    5. Dim DInfo As New List(Of DateiInfo)
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. For Each dr As System.IO.DriveInfo In My.Computer.FileSystem.Drives
    8. If (dr.DriveFormat = "FAT32") Or (dr.DriveFormat = "NTFS") Then
    9. VZInfo.Add(New VerzeichnisInfo With {.Format = dr.DriveFormat, .RootDirectory = dr.RootDirectory.Name, .Typ = dr.DriveType, .VolumeLabel = dr.VolumeLabel})
    10. End If
    11. Next
    12. For i = 0 To VZInfo.Count - 1
    13. Dim fsw As New FileSystemWatcher
    14. fsw.Path = VZInfo(i).RootDirectory
    15. fsw.IncludeSubdirectories = True
    16. fsw.EnableRaisingEvents = True
    17. fsw.NotifyFilter = NotifyFilters.Attributes
    18. AddHandler fsw.Changed, AddressOf OnChanged
    19. Next
    20. End Sub
    21. Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs)
    22. Name_ = e.FullPath
    23. If DInfo.Exists(AddressOf Exestiert) Then
    24. Index_ = DInfo.FindIndex(AddressOf Finden)
    25. Else
    26. DInfo.Add(New DateiInfo With {.Dateiname = e.FullPath, .AnzahlAufrufe = 1})
    27. End If
    28. End Sub
    29. Private Name_ As String
    30. Private Index_ As Integer
    31. Function Finden(ByVal obj As DateiInfo) As Integer
    32. End Function
    33. Function Exestiert(ByVal obj As DateiInfo) As Boolean
    34. If obj.Dateiname = Name_ Then
    35. Return True
    36. Else
    37. Return False
    38. End If
    39. End Function
    40. Structure VerzeichnisInfo
    41. Public Format As String
    42. Public Typ As String
    43. Public VolumeLabel As String
    44. Public RootDirectory As String
    45. End Structure
    46. Structure DateiInfo
    47. Public Dateiname As String
    48. Public AnzahlAufrufe As UInteger
    49. End Structure
    50. End Class




    der relevante Teil ist folgender :


    VB.NET-Quellcode

    1. Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs)
    2. Name_ = e.FullPath
    3. If DInfo.Exists(AddressOf Exestiert) Then
    4. Index_ = DInfo.FindIndex(AddressOf Finden)
    5. Else
    6. DInfo.Add(New DateiInfo With {.Dateiname = e.FullPath, .AnzahlAufrufe = 1})
    7. End If
    8. End Sub
    9. Private Name_ As String
    10. Private Index_ As Integer
    11. Function Finden(ByVal obj As DateiInfo) As Integer
    12. End Function
    13. Function Exestiert(ByVal obj As DateiInfo) As Boolean
    14. If obj.Dateiname = Name_ Then
    15. Return True
    16. Else
    17. Return False
    18. End If
    19. End Function



    Nur weis ich nicht wie ich in der "Finden" Methode den index des Objektes herausbekommen kann.
    Es soll herausgefunden werden ob in der Liste DInfo bereits ein Element mit dem gleichen Dateiname entahlten ist. Wenn ja soll das Element AnzahlAufrufe des Listenelements um 1 erhöht werden.

    Ich habe mir schon ein par Beiträge sowie die MSDN durchgelesen und auch etwas gefunden aber nicht verstanden.


    wenn mir jemand weiterhelfen kann wäre das sehr nett.

    mfg
    Hallo mcdt,

    in groben Zügen würde das bei mir so aussehen.

    Beispiel:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Structure myFileInfo
    3. Public filename As String
    4. Public folder As String
    5. End Structure
    6. Private myFileInfos As New List(Of myFileInfo)
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. find_filename_arg = "Diesen Dateinamen suche ich"
    9. Dim ret As myFileInfo = myFileInfos.Find(AddressOf find_filename)
    10. Stop
    11. End Sub
    12. Private find_filename_arg As String
    13. Private Function find_filename(ByVal fi As myFileInfo) As Boolean
    14. If fi.filename = find_filename_arg Then
    15. Return True
    16. Else
    17. Return False
    18. End If
    19. End Function
    20. End Class


    Gruss

    mikeb69
    Hallo mcdt,

    das ist nicht schwer.

    1. Suchwert übergeben und Suche starten

    VB.NET-Quellcode

    1. find_filename_arg = "Diesen Dateinamen suche ich"
    2. Dim ret As myFileInfo = myFileInfos.Find(AddressOf find_filename)

    Hier wird der Suchwert an eine Variable übergeben die auch ausserhalb der Sub gültigkeit hat.
    Die Suche wird in der zweiten Zeile angestoßen.
    myfileinfos ist hier die Beispielliste

    2. Die eigentliche Suche

    VB.NET-Quellcode

    1. Private find_filename_arg As String
    2. Private Function find_filename(ByVal fi As myFileInfo) As Boolean
    3. If fi.filename = find_filename_arg Then
    4. Return True
    5. Else
    6. Return False
    7. End If
    8. End Function

    Die Funktion wird für jeden Eintrag der Liste abgearbeitet.
    Ist der Vergleich gut - wird True zurückgegeben und du hast einen Treffer.

    Beachte:
    Der Funktion wird immer ein Element der Liste übergeben

    VB.NET-Quellcode

    1. find_filename(ByVal fi As myFileInfo)


    Nicht schwer.

    Gruss

    mikeb69
    Um das besser zu verstehen vllt ein Hinweis.

    Diese Funktion, bzw der Delegat der auf die Funktion find_filename verweist durchläuft einfach alle Elemente der Liste und führt den Vgl, den du in der Methode definierst durch.

    Du könntest also auch folgendes machen, mit dem selben Ergebnis zumindest:

    VB.NET-Quellcode

    1. Private Function FindItem() As myFileInfo
    2. 'Du durchläufst einfach selber deine Liste, und vergleichst jedes Element auf den entsprechenden Namen oder was auch immer
    3. For Each FileInf As myFileInfo In myFileInfos
    4. If FileInf.filename = find_filename_arg Then
    5. Return FileInf
    6. End If
    7. Next
    8. Return Nothing
    9. End Function


    Dies soll eigentlich nur veranschaulichen was passiert.

    Für den Index gibts im übrigen die Methode FindIndex.
    Diese funktioniert genauso wie Find, nur gibt sie den Index statt dem Item zurück

    Gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Hi,

    ich bin mir nicht ganz sicher, aber irgendwo hab ich soetwas schon einmal gesehen :

    VB.NET-Quellcode

    1. Dim suchergebnisse As List(Of myFileInfo) = Select f As myFileInfo From myFileInfos Where f.dateiname = "dateiname"


    Das ist jetzt aus dem Kopf geschrieben, ich teste das jetzt auch mal ;)

    Edit : kann aber sein, dass das totaler Quatsch ist..
    Edit2 : Es handelt sich um Linq, ich lese mir gerade das Kapitel im Buch durch und antworte später..

    Edit3 : So müsste es klappen :

    VB.NET-Quellcode

    1. Imports System.Linq
    2. Dim Suchergebnisse As List(Of myFileInfo) = From f In myFileInfos Where f.filename = "zu suchender name"


    gruß, Trudi

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

    Trudi schrieb:

    Hi,

    Edit3 : So müsste es klappen :
    [code=vbnet
    Dim Suchergebnisse As List(Of myFileInfo) = From f In myFileInfos Where f.filename = "zu suchender name"[/code]

    Bei mir musste noch ein .toList hin, sonst gabs Fehler (ähnlicher Fall...):
    = (From f In myFileInfos Where f.filename = "zu suchender name").toList
    Thema aus genanntem Grund geschlossen.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: