Comment pourrais-je sortinger une liste de fichiers par nom pour correspondre à la façon dont l’Explorateur Windows les affiche?

Supposons que j’ai sortingé une liste de fichiers dans Explorer par nom, comme suit:

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

J’ai un FileInfo Comparer qui sortinge un tableau d’objects FileInfo par nom:

class FileInfoComparer : IComparer { public int Compare(FileInfo x, FileInfo y) { return ssortingng.Compare(x.FullName, y.FullName, SsortingngComparison.OrdinalIgnoreCase); } } 

En sortingant la même liste de fichiers en utilisant cette liste, vous obtenez:

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

ce qui est problématique, car l’ordre est extrêmement important.

J’imagine qu’il existe un moyen d’imiter ce que Windows fait dans le code C #, mais je n’ai pas encore trouvé de moyen. Toute aide est appréciée!

Merci!

Windows Explorer utilise une API appelée:

 StrCmpLogicalW 

effectuer le sorting de manière “logique”.

Quelqu’un a également implémenté une classe en C # qui le fera pour vous.

Vous pouvez également utiliser P / Invoke pour appeler l’API win32. Ce comportement serait le plus cohérent et pourrait être plus performant (je comparerais les deux options). Même le lien de projet de code n’est pas entièrement compatible avec le comportement de Windows et il n’est pas évolutif.

Vous avez besoin d’un sorting numérique naturel qui, malheureusement, il n’existe pas d’implémentation native dans le framework .NET. Cet article sur CodeProject vous dira tout ce que vous devez savoir sur la création de votre propre clone .NET.