bedinge Variablendeklaration

  • VB.NET

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

    bedinge Variablendeklaration

    Hallo Zusammen,
    ich möchte eine Liste von Dateien in einem Ordner nach unterschiedlichen Kriterien sortieren.
    Name auf- oder absteigend, Erstellungsdatum auf- oder absteigend. Eine entsprechend elegante Möglichkeit habe ich gefunden. Nun möchte ich aber, dass in Abhängigkeit eines Kommandozeilenparameters meiner Kommandozeilenanwendung die jeweils gewünschte Sortieroption im Programm anwendung findet. Allerdings klappt das nicht wie erwartet.

    Sortierung könnte wie folgt gehen:

    VB.NET-Quellcode

    1. Dim logFiles As List(Of IO.FileInfo) = (From fi As IO.FileInfo In
    2. logDirInfo.GetFiles("*.log", IO.SearchOption.TopDirectoryOnly) Order By
    3. fi.CreationTime Select fi descending).ToList

    und codieren wollte ich jetzt in etwa

    VB.NET-Quellcode

    1. select argument
    2. case argasc
    3. dim irgendwas
    4. case argdes
    5. dim irgendwas
    6. end select

    Wenn ich nach der Case-Anweisung aber auf irgendwas zugreifen will erhalte ich einen Syntax-Error "irgendwas wurde nicht deklariert".

    Wie kann ich denn eine bedingte Deklaration machen bzw. wie läst sich eine Liste aus System.FileInfo nach der Deklartion alternativ nach Datum oder Name möglichst schnell (ohne einen eigenen Sort schreiben zu müssen) auf- bzw. absteigend sortieren?

    Oder muss ich jetzt wirklich 4 verschiedene Objekte generieren damit ich 4 verschiedene Sortierungen erhalte und dann einfach einem 5. Objekt die Objekte 1 bis 4 in Abhängigkeit vom übergebenen Kommandozeilenparameter zuweisen. Das wäre ja auch noch eine Option. Finde ich aber nicht elegant.
    Sorry, ich bin kein Überflieger - wie soll das denn funktionieren?

    Wie müsste der Code denn umgebaut werden?

    VB.NET-Quellcode

    1. Dim di As DirectoryInfo = New DirectoryInfo(lPgmParm.lQuelle)
    2. Select Case lPgmParm.lSort
    3. Case SortType.namedesc
    4. Dim lData As List(Of IO.FileInfo) = (From fi As IO.FileInfo In di.GetFiles("*.*", IO.SearchOption.TopDirectoryOnly) Order By fi.Name Descending Select fi).ToList
    5. Case SortType.nameasc
    6. Dim lData As List(Of IO.FileInfo) = (From fi As IO.FileInfo In di.GetFiles("*.*", IO.SearchOption.TopDirectoryOnly) Order By fi.Name Ascending Select fi).ToList
    7. Case SortType.datedesc
    8. Dim lData As List(Of IO.FileInfo) = (From fi As IO.FileInfo In di.GetFiles("*.*", IO.SearchOption.TopDirectoryOnly) Order By fi.CreationTime Descending Select fi).ToList
    9. Case SortType.dateasc
    10. Dim lData As List(Of IO.FileInfo) = (From fi As IO.FileInfo In di.GetFiles("*.*", IO.SearchOption.TopDirectoryOnly) Order By fi.CreationTime Ascending Select fi).ToList
    11. End Select
    12. For i = 0 To ldata.count - 1
    13. Dim s = ldata(x)
    14. Console.WriteLine(s.CreationTime & s.Name)
    15. Next
    Als erstes sortierst du immer mit Ascending (bzw. kannst du auch weglassen, wird sowieso aufsteigend sortiert). Je nach dem, welche Option dann gesetzt ist kannst du die Liste entweder so belassen, wie sie ist, oder sie mit .Reverse umkehren. Die Eigenschaft, nach der sortiert wird, kannst du glaube ich nur hardcode.
    Schau einmal hier(DirectoryInfo.EnumerateFiles-Methode) rein...
    und strukturiere einmal so:

    VB.NET-Quellcode

    1. Dim lData As List(Of IO.FileInfo)
    2. Select Case lPgmParm.lSort
    3. Case SortType.namedesc
    4. lData = ...
    5. Case SortType.nameasc
    6. lData = ...
    7. Case SortType.datedesc
    8. lData = ...
    9. Case SortType.dateasc
    10. lData = ...
    11. End Select
    Dein Fehler war also durch Mißachtung des Gültigkeitsbereiches entstanden. Lies ma in dieses Buch lesen (hingegen das Galileio-Openbook ist Mist) das Thema nach - ist wichtig, das möglichst gut zu verstehen, und nicht bei halbem Verständnis ("ah, jetzt läufts ja!") stehenzubleiben.