C#: Implementation of, or alternative to, StrCmpLogicalW in shlwapi.dll
c#, extern, natural-sort
Solution
I just implemented natural string comparison in C#, perhaps someone might find it useful:
public class NaturalComparer : IComparer<string>
{
public int Compare(string x, string y)
{
if (x == null && y == null) return 0;
if (x == null) return -1;
if (y == null) return 1;
int lx = x.Length, ly = y.Length;
for (int mx = 0, my = 0; mx < lx && my < ly; mx++, my++)
{
if (char.IsDigit(x[mx]) && char.IsDigit(y[my]))
{
long vx = 0, vy = 0;
for (; mx < lx && char.IsDigit(x[mx]); mx++)
vx = vx * 10 + x[mx] - '0';
for (; my < ly && char.IsDigit(y[my]); my++)
vy = vy * 10 + y[my] - '0';
if (vx != vy)
return vx > vy ? 1 : -1;
}
if (mx < lx && my < ly && x[mx] != y[my])
return x[mx] > y[my] ? 1 : -1;
}
return lx - ly;
}
}
Problem
For natural sorting in my application I currently P/Invoke a function called StrCmpLogicalW in shlwapi.dll. I was thinking about trying to run my application under Mono, but then of course I can't have this P/Invoke stuff (as far as I know anyways). Is it possible to see the implementation of that method somewhere, or is there a good, clean and efficient C# snippet which does the same thing? My code currently looks like this: ``` [SuppressUnmanagedCodeSecurity] internal static class SafeNativeMethods { [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] public static extern int StrCmpLogicalW(string psz1, string psz2); } public class NaturalStringComparer : IComparer<string> { private readonly int modifier = 1; public NaturalStringComparer() : this(false) {} public NaturalStringComparer(bool descending) { if (descending) modifier = -1; } public int Compare(string a, string b) { return SafeNativeMethods.StrCmpLogicalW(a ?? "", b ?? "") * modifier; } } ``` So, what I'm looking for is an alternative to the above class which doesn't use an extern function.