Dateien sortieren nach Dateinamen (Eigenschaft)

  • VB.NET

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

    Dateien sortieren nach Dateinamen (Eigenschaft)

    Moin!

    ich soll alle Dateien ab einer Verzeichnisebene zeitlich sortiert auflisten lassen. Dabei sollen die jüngsten Dateien zuerst aufgeführt werden.

    Die Ausgabe soll entweder das letzte Dateiveränderungsdatum berücksichtigen oder aber den Dateinamen.

    Bei dem Dateinamen sind nur die berücksichtigen, die mit der Namenskonvention YYYY-MM-DD_ beginnen.

    Das rekursive auflisten aller Dateien ab einer Verzeichnisebene ist nicht das Problem. Aber wie löst man am einfachsten die Sortieraufgabe?

    Bei der Namenssortierung wäre folgendes noch eine gutes Nebenprodukt zu ermitteln wie viele Dateien insgesamt vorliegen und wie viele berücksichtigt wurden.

    Kann mir einer von Euch mit einem Tipp weiterhelfen??

    Gruß Jan
    Moin!
    erst einmal vielen Dank.

    Ich habe mir das zweite Beispiel mit den Parts in zwei einzelne Klassen kopiert - bekomme aber jetzt für die Part-Klasse folgende Fehlermeldung:

    Class "Part" muss "Function Equals(other As EBL_Ex2GrundDok.Part) As Boolean" für die System.IEquatable(Of Part)-Schnittstelle implementieren.


    Darüber hinaus wird weiter unten im Code

    Visual Basic-Quellcode

    1. ' Default comparer for Part.
    2. Public Function CompareTo(comparePart As Part) As Integer _
    3. Implements IComparable(Of ListSortVB.Part).CompareTo
    4. ' A null value means that this object is greater.
    5. If comparePart Is Nothing Then
    6. Return 1
    7. Else


    ListSortVB.Part als

    Der Typ "ListSortVB.Part" ist nicht definiert.


    Ich verstehe aber nicht, was hier fehlt.

    Kann mir einer von Euch weiterhelfen?

    Gruß Jan
    Moin !

    die Klasse Part ist wie folgt definiert:

    Visual Basic-Quellcode

    1. Imports System.Collections.Generic
    2. ' Simple business object. A PartId is used to identify the type of part
    3. ' but the part name can change.
    4. Public Class Part
    5. Implements IEquatable(Of Part)
    6. Implements IComparable(Of Part)
    7. Public Property PartName() As String
    8. Get
    9. Return m_PartName
    10. End Get
    11. Set(value As String)
    12. m_PartName = Value
    13. End Set
    14. End Property
    15. Private m_PartName As String
    16. Public Property PartId() As Integer
    17. Get
    18. Return m_PartId
    19. End Get
    20. Set(value As Integer)
    21. m_PartId = Value
    22. End Set
    23. End Property
    24. Private m_PartId As Integer
    25. Public Overrides Function ToString() As String
    26. Return "ID: " & PartId & " Name: " & PartName
    27. End Function
    28. Public Overrides Function Equals(obj As Object) As Boolean
    29. If obj Is Nothing Then
    30. Return False
    31. End If
    32. Dim objAsPart As Part = TryCast(obj, Part)
    33. If objAsPart Is Nothing Then
    34. Return False
    35. Else
    36. Return Equals(objAsPart)
    37. End If
    38. End Function
    39. Public Function SortByNameAscending(name1 As String, name2 As String) As Integer
    40. Return name1.CompareTo(name2)
    41. End Function
    42. ' Default comparer for Part.
    43. Public Function CompareTo(comparePart As Part) As Integer _
    44. Implements IComparable(Of ListSortVB.Part).CompareTo
    45. ' A null value means that this object is greater.
    46. If comparePart Is Nothing Then
    47. Return 1
    48. Else
    49. Return Me.PartId.CompareTo(comparePart.PartId)
    50. End If
    51. End Function
    52. Public Overrides Function GetHashCode() As Integer
    53. Return PartId
    54. End Function
    55. Public Overloads Function Equals(other As Part) As Boolean Implements IEquatable(Of ListSortVB.Part).Equals
    56. If other Is Nothing Then
    57. Return False
    58. End If
    59. Return (Me.PartId.Equals(other.PartId))
    60. End Function
    61. ' Should also override == and != operators.
    62. End Class


    und die Klasse Example

    Visual Basic-Quellcode

    1. Public Class Example
    2. Public Shared Sub Main()
    3. ' Create a list of parts.
    4. Dim parts As New List(Of Part)()
    5. ' Add parts to the list.
    6. parts.Add(New Part() With { _
    7. .PartName = "regular seat", _
    8. .PartId = 1434 _
    9. })
    10. parts.Add(New Part() With { _
    11. .PartName = "crank arm", _
    12. .PartId = 1234 _
    13. })
    14. parts.Add(New Part() With { _
    15. .PartName = "shift lever", _
    16. .PartId = 1634 _
    17. })
    18. ' Name intentionally left null.
    19. parts.Add(New Part() With { _
    20. .PartId = 1334 _
    21. })
    22. parts.Add(New Part() With { _
    23. .PartName = "banana seat", _
    24. .PartId = 1444 _
    25. })
    26. parts.Add(New Part() With { _
    27. .PartName = "cassette", _
    28. .PartId = 1534 _
    29. })
    30. ' Write out the parts in the list. This will call the overridden
    31. ' ToString method in the Part class.
    32. Console.WriteLine(vbLf & "Before sort:")
    33. For Each aPart As Part In parts
    34. Console.WriteLine(aPart)
    35. Next
    36. ' Call Sort on the list. This will use the
    37. ' default comparer, which is the Compare method
    38. ' implemented on Part.
    39. parts.Sort()
    40. Console.WriteLine(vbLf & "After sort by part number:")
    41. For Each aPart As Part In parts
    42. Console.WriteLine(aPart)
    43. Next
    44. ' This shows calling the Sort(Comparison(T) overload using
    45. ' an anonymous delegate method.
    46. ' This method treats null as the lesser of two values.
    47. parts.Sort(Function(x As Part, y As Part)
    48. If x.PartName Is Nothing AndAlso y.PartName Is Nothing Then
    49. Return 0
    50. ElseIf x.PartName Is Nothing Then
    51. Return -1
    52. ElseIf y.PartName Is Nothing Then
    53. Return 1
    54. Else
    55. Return x.PartName.CompareTo(y.PartName)
    56. End If
    57. End Function)
    58. Console.WriteLine(vbLf & "After sort by name:")
    59. For Each aPart As Part In parts
    60. Console.WriteLine(aPart)
    61. Next
    62. '
    63. '
    64. ' Before sort:
    65. ' ID: 1434 Name: regular seat
    66. ' ID: 1234 Name: crank arm
    67. ' ID: 1634 Name: shift lever
    68. ' ID: 1334 Name:
    69. ' ID: 1444 Name: banana seat
    70. ' ID: 1534 Name: cassette
    71. '
    72. ' After sort by part number:
    73. ' ID: 1234 Name: crank arm
    74. ' ID: 1334 Name:
    75. ' ID: 1434 Name: regular seat
    76. ' ID: 1444 Name: banana seat
    77. ' ID: 1534 Name: cassette
    78. ' ID: 1634 Name: shift lever
    79. '
    80. ' After sort by name:
    81. ' ID: 1334 Name:
    82. ' ID: 1444 Name: banana seat
    83. ' ID: 1534 Name: cassette
    84. ' ID: 1234 Name: crank arm
    85. ' ID: 1434 Name: regular seat
    86. ' ID: 1634 Name: shift lever
    87. End Sub
    88. End Class


    Gruß Jan

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

    Aus der Hüfte geschossen kannst du es (sicherlich etwas schöner) ungefähr so machen:

    Quellcode

    1. Public Class SortierteKlasse
    2. Implements IComparable
    3. Private _Dateiname As String
    4. Public Property Dateiname() As String
    5. Get
    6. Return _Dateiname
    7. End Get
    8. Set(ByVal value As String)
    9. _Dateiname = value
    10. End Set
    11. End Property
    12. Private _Erstelldatum As Date
    13. Public Property Erstelldatum() As Date
    14. Get
    15. Return _Erstelldatum
    16. End Get
    17. Set(ByVal value As Date)
    18. _Erstelldatum = value
    19. End Set
    20. End Property
    21. Public Sub New(sDatei As String, dErstellt As Date)
    22. _Dateiname = sDatei
    23. _Erstelldatum = dErstellt
    24. End Sub
    25. Public Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo
    26. Return Date.Compare(Erstelldatum, DirectCast(obj, SortierteKlasse).Erstelldatum)
    27. End Function
    28. End Class

    Gruß Murdoc

    jan99 schrieb:

    die Klasse Part ist wie folgt definiert:
    Würdest Du so einen Post beantworten?
    1. Leerzeilen raus
    2. Spoiler drumherum
    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!

    jan99 schrieb:

    Ich kann mir nicht vorstellen,
    dass jemand diesen Code gern durchsieht.
    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!
    sieht immer noch genauso unmöglich aus.
    also sorry - 300 Zeilen Code mal eben so durchgucken - da muss ich aber echt in Feiertagslaune sein.

    Aber vlt. ist eh besser, du hängst gleich ein lauffähiges TestProjekt an - aber ohne Binaries.
    Im VisualStudio ists viel einfacher, auch umfangreicheren Code zu verstehen.

    jan99 schrieb:

    Ich habe mir das zweite Beispiel mit den Parts in zwei einzelne Klassen kopiert - bekomme aber jetzt für die Part-Klasse folgende Fehlermeldung:

    Class "Part" muss "Function Equals(other As EBL_Ex2GrundDok.Part) As Boolean" für die System.IEquatable(Of Part)-Schnittstelle implementieren.
    Das ist einfach die Wahrheit. Wenn du dieses codest

    VB.NET-Quellcode

    1. Public Class Part
    2. Implements IEquatable(Of Part)
    dann musst du das Interface auch implementiern.
    Mehr darüber können dir sicherlich diejenigen sagen, die dir empfohlen haben, dieses Interface zu implementieren.