List(Of FileInfo) nach Name sortieren

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    List(Of FileInfo) nach Name sortieren

    Hi,

    ich habe eine List(Of FileInfo) und möchte diese nach dem Dateinamen sortieren

    Eine List(Of String) lässt sich einfach mit .Sort() sortieren, wenn es allerdings ein List(Of FileInfo) ist bekomme ich den Fehler "Fehler beim Vergleichen von zwei Elementen im Array."
    Ich schätz, ich muss mir wohl so einen Comparer oder IComparer basteln. Leider hilft mir MSDN nicht wirklich weiter, versteh ichs nicht ganz was ich machen muss. msdn.microsoft.com/de-de/library/b0zbh7b6.aspx

    VB.NET-Quellcode

    1. Dim f_info As New List(Of FileInfo)
    2. Dim fso As New DirectoryInfo(vz_path)
    3. For Each file_info As FileInfo In fso.GetFiles()
    4. f_info.Add(file_info)
    5. Next (file_info)
    6. f_info.Sort()
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Du kannst dir auch eine eigene Vergleichsroutine schreiben, habe sowas auch mal gemacht um Dateien zu vergleichen.

    VB.NET-Quellcode

    1. Private Class FiCompare
    2. Implements IComparer
    3. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
    4. Dim fiX As FileInfo = DirectCast(x, FileInfo)
    5. Dim fiY As FileInfo = DirectCast(y, FileInfo)
    6. Dim iX As Integer = Convert.ToInt32(fiX.Name.Replace(fiX.Extension, String.Empty))
    7. Dim iY As Integer = Convert.ToInt32(fiY.Name.Replace(fiY.Extension, String.Empty))
    8. Return iX - iY
    9. End Function
    10. End Class


    Hierbei haben die Dateinamen nur Nummern nach denen sie Sortiert werden sollen. Du kannst aber auch eine andere Bedingung erstellen der Returnwert einfach anpassen, wie, findest du bei MSDN, weiß gerade nicht die genaue Bedingung.

    Aufruf dann

    VB.NET-Quellcode

    1. Array.Sort(fiFiles, New FiCompare)
    LINQ war das stichwort! Das ist ja was wirklich geniales ^^ hab LINQ noch nie benutzt ^^

    VB.NET-Quellcode

    1. Dim file_List As New List(Of FileInfo)
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim vz_path As String = vz_list2.Item(lb_proj.SelectedIndex) & "\" & "Lieferanten-Bestellungen-Schriftverkehr"
    4. Dim fso As New DirectoryInfo(vz_path)
    5. Dim f_info As New List(Of FileInfo)
    6. For Each x As FileInfo In fso.GetFiles()
    7. f_info.Add(x)
    8. Next (x)
    9. Dim file_Query = From x In f_info Where x.Name Like "*RE*" Select x Order By x.Name Ascending
    10. file_List = file_Query.ToList()
    11. For Each str As FileInfo In file_List
    12. ListBox1.Items.Add(str.Name)
    13. Next
    14. End Sub
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    VB.NET-Quellcode

    1. Function list_files(ByVal path As String, ByVal search_str As String, Optional ByVal file_type As String = "*") As List(Of FileInfo)
    2. Dim fso As New DirectoryInfo(path)
    3. Dim file_Query = From x In fso.GetFiles(file_type).ToList
    4. Where x.Name Like search_str And x.Attributes = FileAttributes.Normal = True
    5. Select x Order By x.Name Ascending
    6. Return file_Query.ToList()
    7. End Function


    Ja es war noch ziemlich viel müll drin, hab es runterreduziert auf diese schöne Funktion :)
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    quizfrage:
    woran erkennt man nen VB6'ler?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim fso As New DirectoryInfo(path)

    (schön' Gruß vom FileSystemObject?


    BTW: Das einzige was rockt, sind LINQe Einzeiler ... ;)

    VB.NET-Quellcode

    1. Function list_files(ByVal path As String, ByVal search_str As String, Optional ByVal file_type As String = "*") As List(Of FileInfo)
    2. Return (From x
    3. In (New IO.DirectoryInfo(path)).GetFiles(file_type)
    4. Where (x.Name Like search_str) AndAlso
    5. (x.Attributes = IO.FileAttributes.Normal)
    6. Select x Order By x.Name Ascending).ToList
    7. End Function


    BTW2:

    DAS:

    VB.NET-Quellcode

    1. And x.Attributes = FileAttributes.Normal = True

    ist ein "=" zu viel (s.o.)
    Wie wär's alternativ damit:

    VB.NET-Quellcode

    1. Function list_files(ByVal path As String, ByVal search_str As String) As List(Of FileInfo)
    2. Dim fileList As List(Of FileInfo) = New DirectoryInfo(path).GetFiles(search_str).ToList
    3. fileList.Sort(Function(f1 As FileInfo, f2 As FileInfo)
    4. Return String.Compare(f1.Name, f2.Name)
    5. End Function)
    6. Return fileList
    7. End Function
    @picoflop: ich bin kein vb'6 ler ^^ das war vor meiner Zeit :P

    allerdings findet man im Netz noch viel veralten Code und den schlepp ich dann leider oft mit in mein Programm :/

    Ich bin wirklich bemüht meine Syntax zu verbessern und auch nichts veraltetes zu benutzen. Deshalb habt dank ihr zwei :) so ists natürlich noch schöner *g*

    btw ich musste mein Code noch etwas ergänzen:

    VB.NET-Quellcode

    1. Where (x.Name Like search_str) And
    2. (x.Attributes And (FileAttributes.Hidden Or FileAttributes.System)) = False


    Kann man das noch irgendwie besser schreiben? Also alle Dateien die nicht Versteckt und nicht System sind ^^
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „FredM“ ()

    Option Strict Off ^^ nid hauen
    Welchen Vorteil mir das AndAlso bringt erschließt sich mir nicht ganz. Ich kenn das von deiner Homepage.

    "Hier sehen wir den veralteten And - Operator, der ebenso wie IIF in die Mottenkiste gehört. Seit glaub 2005 gibt es den AndAlso - Operator, der den 2. Ausdruck gar nicht erst auswertet, wenn der erste Ausdruck schon False ergibt. Bei den logischen Operatoren in Kap 2.2.3 finden AndAlso und sein Brüderchen OrElse aber überhaupt keine Erwähnung - bin ich hier richtig, in einem Buch über VB2010?"
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Ich hab die allgemeine Anwendung von AndAlso schon verstanden "der 2. Ausdruck wird gar nicht erst auswertet, wenn der erste Ausdruck schon False ergibt"

    Seit ich das gelesen hab benutz ich das bei If-Abfragen, das erspart mir eine zweite innere If-Abfrage :)
    Aber hier..., wie muss ich das bei der LINQ abfrage verstehn? Wenn nicht "like" dem search-string ist, dann wird au garnet nach den Attributen geschaut? Macht die Abfrage also bisschen schneller? :) hm ok verstanden :D
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    ich gehör eigentlich nicht zu der Sorte Menschen, die sich nicht zu helfen wissen, ich stand nur grad aufem Schlauch ^^
    zu meiner Verteidigung muss ich hervorheben, icemanns hat mich auf LINQ aufmerksam gemacht, und ich habs ganz alleine damit geschafft :)

    sei nicht so hart zu mir ;) - "Wer nicht fragt bleibt dumm"
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    ich bitte dich ja nur darum, einfach mal die schritte auszuführen, die ich in post#12 gesagt habe.

    einfach mal - machen

    Ich wiederhols dir sogar:
    schreib AndAlso irgendwo sinnvoll in deinen Code, setz den cursor drauf und F1 drücken.


    Oder hast du bereits, und willst mir nurnicht sagen, obs funzt?
    ja hab ich dann bin ich hier gelandet, wieso sollte das nicht funktionieren? ^^
    msdn.microsoft.com/query/dev10…k%28DevLang-VB%29&rd=true
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Nachträgliches:
    Wir wär's mit

    VB.NET-Quellcode

    1. Dim Liste As New List(Of IO.FileInfo)
    2. For Each i In Liste.OrderBy(Function(Info As IO.FileInfo) Info.Name)
    3. Next
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils