2009-06-18 2 views
3

Lassen Sie uns sagen, dass ich eine Liste von Dateien im Explorer nach Namen sortiert haben, etwa so:Wie würde ich eine Liste von Dateien nach Namen sortieren, damit sie dem Windows Explorer entsprechen?

2009-06-02-4.0.9.txt
2009-06-02-4.0.10.txt
2009-06-02-4.0.11.txt
2009-06-02-4.0.12.txt

ich habe ein Fileinfo Comparer, die ein Array von Fileinfo-Objekte nach Namen sortiert:

class FileInfoComparer : IComparer<FileInfo> { 
     public int Compare(FileInfo x, FileInfo y) { 
      return string.Compare(x.FullName, 
            y.FullName, 
            StringComparison.OrdinalIgnoreCase); 
     } 
    } 

Sortieren der gleichen Liste von Dateien von oben mit diesem Comparer Ausbeute:

2009-06-02-4.0.10.txt
2009-06-02-4.0.11.txt
2009-06-02-4.0.12.txt
2009-06-02 -4.0.9.txt

was problematisch ist, da die Reihenfolge extrem wichtig ist.

Ich würde mir vorstellen, dass es eine Möglichkeit gibt, nachzuahmen, was Windows in C# -Code tut, aber ich muss noch einen Weg finden. Jede Hilfe wird geschätzt!

Danke!

+0

möglich Duplikat von [Natürliche Sortierreihenfolge in C#] (http://StackOverflow.com/Questions/248603/Natural-Sort-Order-in-C-Sharp) –

Antwort

10

Windows Explorer verwendet eine API genannt:

StrCmpLogicalW 

die Art in einer "logischen" Art und Weise auszuführen.

Jemand hat auch implemented a class in C#, die das für Sie tun wird.

+0

Sehr schön! Vielen Dank! – Pwninstein

3

Sie können P/Invoke auch verwenden, um die win32-API aufzurufen. Dies wäre das konsistenteste Verhalten und könnte eine bessere Leistung bringen (ich würde beide Optionen benchmarken). Selbst die Verknüpfung des Code-Projekts stimmt nicht vollständig mit dem Windows-Verhalten überein und ist nicht zukunftssicher.

2

Sie benötigen eine natürliche numerische Sortierung, die es leider im .NET-Framework nicht gibt. This article auf CodeProject wird Ihnen alles erzählen, was Sie über das Bilden Ihres eigenen Klons wissen müssen.

+1

Das Implementieren einer eigenen Version von StrCmpLogicalW in verwaltetem Code ist die beste Option, und der Artikel im Code-Projekt macht das ganz einfach. – kingdango