Sorting an array of folder names like Windows Explorer (Numerically and Alphabetically) - VB.NET Sorting an array of folder names like Windows Explorer (Numerically and Alphabetically) - VB.NET arrays arrays

Sorting an array of folder names like Windows Explorer (Numerically and Alphabetically) - VB.NET


You would need to implement an IComparer, as opposed to creating a class that implements IComparable. The difference is that an IComparer has the necessary "knowledge" to compare two objects whereas IComparable is implemented by a class that knows how to compare itself against something else.

And the way Windows Explorer sorts filenames is using a function called StrCmpLogicalW. You can use this function in your own IComparer to get the same sort behavior as Windows Explorer. This function treats numeric parts of strings as numbers so that 9 sorts before 10.

public class MyComparer : IComparer<string> {    [DllImport("shlwapi.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]    static extern int StrCmpLogicalW(String x, String y);    public int Compare(string x, string y) {        return StrCmpLogicalW(x, y);    }}Array.Sort(unsortedNames, new MyComparer());

And since I just noticed the question is tagged VB... Forgive my rusty VB!

Public Class MyComparer    Implements IComparer(Of String)    Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" ( _        ByVal s1 As String, _        ByVal s2 As String) As Int32    Public Function Compare(Byval x as String, Byval y as String) As Integer _        Implements System.Collections.Generic.IComparer(Of String).Compare        Return StrCmpLogicalW(x, y)    End FunctionEnd Class


Array.Sort has an IComparer parameter too, you can override sorting behavior if you don't like the default. see Array.Sort Method (T[], IComparer) how to do it