Skip to content

Commit 72b112a

Browse files
authored
Merge pull request #122 from El-Gor-do/fix-issue-121
Equalise the length of non-numeric tokens before sorting
2 parents 3a488d4 + a53f421 commit 72b112a

File tree

2 files changed

+33
-16
lines changed

2 files changed

+33
-16
lines changed

src/NaturalSort.Extension/NaturalSortComparer.cs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -152,27 +152,36 @@ public int Compare(string str1, string str2)
152152
if (paddingCompare != 0)
153153
return paddingCompare;
154154
}
155-
else if (_stringComparer is not null)
156-
{
157-
// compare both tokens as strings
158-
var tokenString1 = str1.Substring(startIndex1, rangeLength1);
159-
var tokenString2 = str2.Substring(startIndex2, rangeLength2);
160-
var stringCompare = _stringComparer.Compare(tokenString1, tokenString2);
161-
if (stringCompare != 0)
162-
return stringCompare;
163-
}
164155
else
165156
{
166-
// use string comparison
167-
var minLength = Math.Min(rangeLength1, rangeLength2);
168-
var stringCompare = string.Compare(str1, startIndex1, str2, startIndex2, minLength, _stringComparison);
169-
if (stringCompare == 0)
157+
// only compare non-numeric tokens up to the shorter of their lengths
158+
if (rangeLength1 < rangeLength2)
170159
{
171-
stringCompare = rangeLength1 - rangeLength2;
160+
rangeLength2 = rangeLength1;
161+
endIndex2 = startIndex2 + rangeLength2;
162+
}
163+
else if (rangeLength2 < rangeLength1)
164+
{
165+
rangeLength1 = rangeLength2;
166+
endIndex1 = startIndex1 + rangeLength1;
172167
}
173168

174-
if (stringCompare != 0)
175-
return stringCompare;
169+
if (_stringComparer is not null)
170+
{
171+
// compare both tokens as strings
172+
var tokenString1 = str1.Substring(startIndex1, rangeLength1);
173+
var tokenString2 = str2.Substring(startIndex2, rangeLength2);
174+
var stringCompare = _stringComparer.Compare(tokenString1, tokenString2);
175+
if (stringCompare != 0)
176+
return stringCompare;
177+
}
178+
else
179+
{
180+
// use string comparison
181+
var stringCompare = string.Compare(str1, startIndex1, str2, startIndex2, rangeLength1, _stringComparison);
182+
if (stringCompare != 0)
183+
return stringCompare;
184+
}
176185
}
177186

178187
startIndex1 = endIndex1;

tests/NaturalSort.Extension.Tests/NaturalSortComparerTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ private static void RunTests_StringComparisonOrdinalIgnoreCase(string[] input, s
6565
new[] { "A", "A10", "A11", "Z", "A੨", "A੨੨" },
6666
new[] { "A", "A੨", "A10", "A11", "A੨੨", "Z" }
6767
)]
68+
[InlineData(
69+
new[] { "a_abc", "a__abc" },
70+
new[] { "a__abc", "a_abc" }
71+
)]
72+
[InlineData(
73+
new[] { "a_abc", "a__abc", "a_123", "a__123", "a_9" },
74+
new[] { "a__123", "a__abc", "a_9", "a_123", "a_abc" }
75+
)]
6876
public void WindowsExplorer(string[] input, string[] expected) => RunTests(input, expected);
6977

7078
/// <remarks>

0 commit comments

Comments
 (0)