StrCmpLogicalW (shlwapi)
Last changed: -79.206.146.153

.
Summary
'Logical' sorting of Unicode strings, the way Windows Explorer sorts filenames on XP.

C# Signature:

[DllImport("shlwapi.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]
static extern int StrCmpLogicalW(String x, String y);

VB Signature:

Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" (ByVal s1 As String, ByVal s2 As String) As Int32

User-Defined Types:

None.

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

Comparison is case insensitive, numbers are treated by numerical value instead of ASCII code, for example:

File1
fIle2
fiLe10

instead of

File1
fiLe10
fIle2

Note
for some reason, Vista Explorer appears to use a different sorting algoritm. The result is similar, but non-alphanumeric characters such as parentheses are ordered differently.

Tips & Tricks:

Please add some!

C# Sample Code:

  public class StringLogicalComparer: IComparer
  {
    [DllImport("shlwapi.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]
    public static extern int StrCmpLogicalW(string x, string y);

    public int Compare(object x, object y)
    {
      return StrCmpLogicalW((string)x, (string)y);
    }
  }

VB Sample Code:

Private Class StringLogicalComparer
  Implements IComparer(Of String)

  Private Declare Unicode Function StrCmpLogicalW Lib "shlwapi" _
    (ByVal s1 As String, ByVal s2 As String) As Integer

  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 Function
End Class

Private Sub Test()
  Dim cp As New StringLogicalComparer
  Debug.WriteLine(cp.Compare("a", "a"))    ' 0
  Debug.WriteLine(cp.Compare("1", "1"))    ' 0
  Debug.WriteLine(cp.Compare("a1", "a2"))  ' -1
  Debug.WriteLine(cp.Compare("a10", "a2")) ' +1
End Sub

Documentation