Directory-List(Of FtpListItem) nach Tiefe sortieren

  • VB.NET

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

    Directory-List(Of FtpListItem) nach Tiefe sortieren

    Hallo,

    Ich habe innerhalb meines Programms eine Liste mit allen Sub-Ordnern ab einem bestimmten Pfad. Diese möchte ich nach Tiefe sortieren (Anzahl von "/" innerhalb des Pfades), sodass die Ordner mit der größten Tiefe ganz oben stehen. Diese Liste wird dann von einer Lösch-Schleife durchlaufen und löscht jeden Ordner der keine Dateien enthält. Da es sich um das Löschen auf einem FTP-Server handelt, lassen sich nur leere Ordner (keine dateien und keiner unterordner) löschen. Deshalb muss ich in der tiefsten Schicht anfangen und mich dann nach oben hin durchlöschen, bis ich einen Ordner treffe der Dateien enthält.

    Mir sind die Sortier-Funktionen list.sort und list.orderby bekannt, jedoch weiß ich nicht wie ich diese in diesem Fall anwenden kann, da es sich um eine Nicht-Standard-Klasse handelt und ich nicht einfach nach einem Attribut des FtpListItems-Objekts filtern kann, sondern ja erst was damit anstellen muss, wie zB. ein String.Split anhand von "/" und dann charArr.count um zu zählen wie viele "/" vorhanden sind.

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

    VB.NET-Quellcode

    1. dim count_ as new predicate(of char)(function(c) c.Equals("/"c))
    2. Dim Compare As New Comparison(Of FtpListItem)(Function(x As FtpListItem, y As FtpListItem)
    3. Return x.Name.Count(count_).CompareTo(y.Name.Count(count_))
    4. End Function)
    5. 'Aufruf
    6. Listxy.Sort(Compare)

    /nicht getestet :P
    /nicht getestet
    Oder so was:
    UriComparer

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private ll As List(Of Uri)
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. ll = New List(Of Uri)
    5. ll.Add(New Uri("www.zdf.de"))
    6. ll.Sort(New UriComparer)
    7. End Sub
    8. End Class
    9. Public Class UriComparer
    10. Inherits Comparer(Of Uri)
    11. Public Overrides Function Compare(x As System.Uri, y As System.Uri) As Integer
    12. Dim xx() As String = x.AbsolutePath.Split("\"c)
    13. Dim yy() As String = y.AbsolutePath.Split("\"c)
    14. Return xx.Length.CompareTo(yy.Length)
    15. End Function
    16. 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!
    Danke für die schnellen Antworten.

    @Antwort 1: Unterschlänglung von count_ in compare: "Der Wert vom Typ "System.Predicate(Of Char)" kann nicht in "System.Func(Of Char, Boolean)" konvertiert werden. Ich weiß leider nicht wie ich das Predicate demnach umbauen muss. Finde auf die Schnelle auch keine passende Vorlage.
    probierma

    VB.NET-Quellcode

    1. dim count_ as new Func(Of Char, Boolean)(function(c) c.Equals("/"c))
    2. Dim Compare As New Comparison(Of FtpListItem)(Function(x As FtpListItem, y As FtpListItem)
    3. Return x.Name.Count(count_).CompareTo(y.Name.Count(count_))
    4. End Function)
    5. 'Aufruf
    6. Listxy.Sort(Compare)
    ungetestet
    die Benamung ist bisserl unglücklich, denn count_ ist ühaupt keine Anzahl, sondern ist eine Bedingung (alias "Predicate").
    Habich spasseshalber mal ganz umgebaut

    VB.NET-Quellcode

    1. Dim countSlash = Function(s As String) s.Count(Function(c) c.Equals("/"c))
    2. Listxy.Sort(Function(x, y) countSlash(y.Name).CompareTo(countSlash(x.Name)))
    Nun sieht man imo deutlich, dass der Sortier-Vergleich darin besteht, dass die Slash-Counts der Namen der Vergleichspartner miteinander verglichen werden.