mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-05-23 13:14:59 +00:00
67 lines
1.8 KiB
C#
67 lines
1.8 KiB
C#
namespace SourceGit.Models
|
|
{
|
|
public static class NumericSort
|
|
{
|
|
public static int Compare(string s1, string s2)
|
|
{
|
|
int len1 = s1.Length;
|
|
int len2 = s2.Length;
|
|
|
|
int marker1 = 0;
|
|
int marker2 = 0;
|
|
|
|
char[] tmp1 = new char[len1];
|
|
char[] tmp2 = new char[len2];
|
|
|
|
while (marker1 < len1 && marker2 < len2)
|
|
{
|
|
char c1 = s1[marker1];
|
|
char c2 = s2[marker2];
|
|
int loc1 = 0;
|
|
int loc2 = 0;
|
|
|
|
bool isDigit1 = char.IsDigit(c1);
|
|
bool isDigit2 = char.IsDigit(c2);
|
|
if (isDigit1 != isDigit2)
|
|
return c1.CompareTo(c2);
|
|
|
|
do
|
|
{
|
|
tmp1[loc1] = c1;
|
|
loc1++;
|
|
marker1++;
|
|
|
|
if (marker1 < len1)
|
|
c1 = s1[marker1];
|
|
else
|
|
break;
|
|
} while (char.IsDigit(c1) == isDigit1);
|
|
|
|
do
|
|
{
|
|
tmp2[loc2] = c2;
|
|
loc2++;
|
|
marker2++;
|
|
|
|
if (marker2 < len2)
|
|
c2 = s2[marker2];
|
|
else
|
|
break;
|
|
} while (char.IsDigit(c2) == isDigit2);
|
|
|
|
string sub1 = new string(tmp1, 0, loc1);
|
|
string sub2 = new string(tmp2, 0, loc2);
|
|
int result;
|
|
if (isDigit1)
|
|
result = loc1 == loc2 ? string.CompareOrdinal(sub1, sub2) : loc1 - loc2;
|
|
else
|
|
result = string.CompareOrdinal(sub1, sub2);
|
|
|
|
if (result != 0)
|
|
return result;
|
|
}
|
|
|
|
return len1 - len2;
|
|
}
|
|
}
|
|
}
|