List (of String) clearen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Gutelaunetyp.

    List (of String) clearen

    Hallo,
    Ich habe eine List (of String).
    Jetzt möchte ich alle Strings entfernen , die mit einen der Endungen aus dem Array Verboten enden.

    Hier mein Codeversuch:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Dim Verboten As String() = {"musik", "playlists", ".mpeg", ".exe", ".avi", ".3gp", ".aac", ".bat"}
    4. Private files As New List(Of String)
    5. Dim Loeschen As New List(Of String)
    6. For i As Integer = 0 To files.Count - 1
    7. For Each NichtErlaubt As String In Verboten
    8. If files(i).ToString.EndsWith(NichtErlaubt) Then
    9. ListLoeschen.Add(files(i))
    10. End If
    11. Next
    12. Next
    13. For Each Loeschen As String In ListLoeschen
    14. Try
    15. files.Remove(Loeschen)
    16. Catch
    17. End Try
    18. Next
    19. End Sub


    Weiss jemand wie?


    Mfg Kevin.
    Vielleicht direkt beim Hinzufügen überprüfen?

    Ansonsten mit Contains überprüfen. Schleife durch Files, ggf. Dateiendung ermitteln und mittels der Contains Methode überprüfen ob die Endung im Array Verboten() vorkommt. Wenn der Array Type kein Contains besitzt einfach aus dem Array ebenfalls eine ListOf machen.
    Am einfachsten ist es mit RemoveAt gleich die verbotenen Strings aus der Liste zu löschen, allerdings darf man natürlich keine "For Each" Schleife verwenden:

    VB.NET-Quellcode

    1. Dim i As Integer = 0
    2. While i < files.Count
    3. ' file überprüfen
    4. For Each v As String In Verboten
    5. If files.Item(i).EndsWith(v) Then files.RemoveAt(i) : Continue While
    6. Next
    7. ' nichts gelöscht: Zeiger erhöhen
    8. i += 1
    9. End While
    Nun das passiert bei dir ebenso wenig.
    Wird ein Element gefunden wird es gelöscht und danach i trotzdem inkrementiert, eigentlich dürfte i nur inkrementiert werden wenn KEIN Element gelöscht wurde, weil ansonsten ja die Elemente nach rutschen sobald eins gelöscht wurde.

    Ich hätte es eher so gelöst:

    VB.NET-Quellcode

    1. Dim Verboten As List(Of String) = {"musik", "playlists", ".mpeg", ".exe", ".avi", ".3gp", ".aac", ".bat"} ' ob diese Zuordnung funktioniert weiß ich nicht genau
    2. For Each f As String In files
    3. For Each v As String In Verboten
    4. If f.Endwith(v) Then
    5. files.Remove(f) ' glaube Remove gibts auch und erwartet das Element und nicht den Index
    6. Exit For
    7. End If
    8. Next
    9. Next


    Soviel mal ausm Kopf zusammen gesponnen, müsste eigentlich funktionieren.

    VB.NET-Quellcode

    1. For i As Integer = 0 To Uploadfiles.Count - 1
    2. For Each v As String In Verboten
    3. If Uploadfiles.Item(i).EndsWith(v) Then
    4. Uploadfiles.RemoveAt(Uploadfiles(i))
    5. End If
    6. Next
    7. Next


    funktioniert leider nicht

    Mfg Kevin.
    sorry, aber das ist jetzt wirklich elementar mein lieber Watson ... ähm Dodo:

    Bei einer For-Schleife ändert man nicht die Elementen-Menge, deshalb ist der TE wohl auf die Idee gekommen die zu löschenden Elemente erst in eine Hilfsliste zu schreiben. Eleganter ist es so wie ich es beschrieben habe.

    Und mein Code inkrementiert nur wenn kein Element gelöscht wurde, da sonst ja ein Element nachrutscht ...

    Edit: @Gutelaunetyp wird Dir vermutlich eine Exception um die Ohren hauen, versuchs mit einer While ...
    Ich biete aus Variantenreichtumsdrang mal noch ne Alternative des Frameworks:

    VB.NET-Quellcode

    1. Private IrgendwasSub()
    2. Dim l As New List(Of String)
    3. l.Add("T")
    4. l.Add("E")
    5. l.Add("S")
    6. l.Add("T")
    7. l.RemoveAll(AddressOf comp)
    8. End Sub
    9. Private verbo As String() = {"T", "E"}
    10. Private Function comp(ByVal s As String) As Boolean
    11. Return verbo.Contains(s)
    12. End Function
    Das ist meine Signatur und sie wird wunderbar sein!
    Hallo,
    Danke Kangaroo , deine Lösung funktioniert 1 a.

    Habe allerdings auch ne Funktion hinbekommen , die wohl vom Code her noch sauberer ist.


    VB.NET-Quellcode

    1. Private Function IsImportantFile(ByVal Pfad As String) As Boolean
    2. Dim Verboten As String() = {"musik", "playlists", ".mpeg", ".exe", ".avi", ".3gp", ".aac", ".bat", ".ini"}
    3. For Each p As String In Verboten
    4. If Pfad.ToLower.Contains(p) Then
    5. Return False
    6. End If
    7. Next
    8. Return True
    9. End Function


    Mfg Kevin.

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