Refactoring: remove redundant code in NumericSort class

This commit is contained in:
Göran W 2025-06-06 09:08:26 +02:00
parent 4fd921ea87
commit 913b5dd7fe

View file

@ -1,4 +1,6 @@
namespace SourceGit.Models using System;
namespace SourceGit.Models
{ {
public static class NumericSort public static class NumericSort
{ {
@ -10,58 +12,50 @@
int marker1 = 0; int marker1 = 0;
int marker2 = 0; int marker2 = 0;
char[] tmp1 = new char[len1]; char[] tmp = new char[Math.Max(len1, len2)];
char[] tmp2 = new char[len2];
while (marker1 < len1 && marker2 < len2) while (marker1 < len1 && marker2 < len2)
{ {
char c1 = s1[marker1]; char c1 = s1[marker1];
char c2 = s2[marker2]; char c2 = s2[marker2];
int loc1 = 0;
int loc2 = 0;
bool isDigit1 = char.IsDigit(c1); bool isDigit1 = char.IsDigit(c1);
bool isDigit2 = char.IsDigit(c2); bool isDigit2 = char.IsDigit(c2);
if (isDigit1 != isDigit2) if (isDigit1 != isDigit2)
return c1.CompareTo(c2); return c1.CompareTo(c2);
do int subLen1 = GetCoherentSubstringLength(s1, len1, marker1, isDigit1, ref tmp);
{ int subLen2 = GetCoherentSubstringLength(s2, len2, marker2, isDigit2, ref tmp);
tmp1[loc1] = c1;
loc1++;
marker1++;
if (marker1 < len1) string sub1 = s1.Substring(marker1, subLen1);
c1 = s1[marker1]; string sub2 = s2.Substring(marker2, subLen2);
else
break;
} while (char.IsDigit(c1) == isDigit1);
do marker1 += subLen1;
{ marker2 += subLen2;
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; int result;
if (isDigit1) if (isDigit1)
result = loc1 == loc2 ? string.CompareOrdinal(sub1, sub2) : loc1 - loc2; {
// NOTE: We don't strip leading zeroes before comparing substring digits/lengths - should we?
result = (subLen1 == subLen2) ? string.CompareOrdinal(sub1, sub2) : (subLen1 - subLen2);
}
else else
{
result = string.CompareOrdinal(sub1, sub2); result = string.CompareOrdinal(sub1, sub2);
}
if (result != 0) if (result != 0)
return result; return result;
} }
return len1 - len2; return len1 - len2;
} }
private static int GetCoherentSubstringLength(string s, int len, int start, bool isDigit, ref char[] tmp)
{
int num = 1;
while (start + num < len && char.IsDigit(s[start + num]) == isDigit)
num++;
return num;
}
} }
} }