none
Ascending/Descending dynamisch RRS feed

  • Frage

  • Hallo zusammen,

    gibt es in folgendem Code eine Möglichkeit, die Sortierrichtung dynamisch, also per Variable zu steuern? Wenn nicht, wie könnte man das Problem anders lösen?

     

    For Each di As DirectoryInfo In (From tmp As DirectoryInfo _
                     In New DirectoryInfo("C:\").GetDirectories() _
                     Order By tmp.Name Ascending)
     Console.WriteLine(di.Name)
    Next
    

    Gruß und Danke

    Sabinchen


    Montag, 7. Juni 2010 16:13

Antworten

  • Hallo Sabinchen,

    das lässt sich ohne Compilerhilfe nur relativ umständlich anders schreiben.
    Denn dabei kommen zwei unterschiedliche Methoden zum Einsatz;
    für aufsteigend Enumerable.OrderBy und für absteigend Enumerable.OrderByDescending

    Man könnte zwar etwas schreiben wie:

        Dim di = From tmp As DirectoryInfo _
           In New DirectoryInfo("C:\").GetDirectories()
        Dim diOrdered As IOrderedEnumerable(Of DirectoryInfo)
        If descending Then
          diOrdered = From d In di Order By d.Name Descending
        Else
          diOrdered = From d In di Order By d.Name Ascending
        End If
        For Each d In diOrdered
          Console.WriteLine(d.Name)
        Next
    

    was aber kaum einen Vorteil gegenüber zwei vollständigen Abfragen bringt.
    Einfacher ist es im allgemeinen ein Reverse zu verwenden:

        Dim di2 As IEnumerable(Of DirectoryInfo) = From d As DirectoryInfo _
              In New DirectoryInfo("C:\").GetDirectories()
              Order By d.Name Ascending
        If descending Then
          di2 = di2.Reverse
        End If
        For Each d2 In di2
          Console.WriteLine(d2.Name)
        Next
    
    Die dritte Alternative, es direkt ohne Compiler Unterstützung zu schreiben,
    bringt wenig, da man einen absteigendenden StringComparer benötigen würde.
    Und der Code sähe eher unleserlich aus.

    Gruß Elmar

    • Als Antwort markiert Sabinchen Montag, 7. Juni 2010 20:59
    Montag, 7. Juni 2010 17:46
    Beantworter

Alle Antworten

  • Hallo Sabinchen,

    das lässt sich ohne Compilerhilfe nur relativ umständlich anders schreiben.
    Denn dabei kommen zwei unterschiedliche Methoden zum Einsatz;
    für aufsteigend Enumerable.OrderBy und für absteigend Enumerable.OrderByDescending

    Man könnte zwar etwas schreiben wie:

        Dim di = From tmp As DirectoryInfo _
           In New DirectoryInfo("C:\").GetDirectories()
        Dim diOrdered As IOrderedEnumerable(Of DirectoryInfo)
        If descending Then
          diOrdered = From d In di Order By d.Name Descending
        Else
          diOrdered = From d In di Order By d.Name Ascending
        End If
        For Each d In diOrdered
          Console.WriteLine(d.Name)
        Next
    

    was aber kaum einen Vorteil gegenüber zwei vollständigen Abfragen bringt.
    Einfacher ist es im allgemeinen ein Reverse zu verwenden:

        Dim di2 As IEnumerable(Of DirectoryInfo) = From d As DirectoryInfo _
              In New DirectoryInfo("C:\").GetDirectories()
              Order By d.Name Ascending
        If descending Then
          di2 = di2.Reverse
        End If
        For Each d2 In di2
          Console.WriteLine(d2.Name)
        Next
    
    Die dritte Alternative, es direkt ohne Compiler Unterstützung zu schreiben,
    bringt wenig, da man einen absteigendenden StringComparer benötigen würde.
    Und der Code sähe eher unleserlich aus.

    Gruß Elmar

    • Als Antwort markiert Sabinchen Montag, 7. Juni 2010 20:59
    Montag, 7. Juni 2010 17:46
    Beantworter
  • Hallo Elmar,

     

    danke für die ausführliche Antwort.

     

    Gruß

    Sabinchen

    Montag, 7. Juni 2010 21:00