Fixed Natural Sorting causing an infinite loop
This commit is contained in:
parent
0d56d66809
commit
00b4f26a3d
|
@ -46,16 +46,15 @@ namespace BFR.Operations
|
|||
files.ReplaceAll(new List<FileModel>(files.Reverse()));
|
||||
}
|
||||
|
||||
// Code taken and slightly modified from https://git.lastassault.de/speatzle/BulkFileRenamer
|
||||
// Using code from stackoverflow
|
||||
// https://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp
|
||||
public static int CompareNatural(string strA, string strB) =>
|
||||
CompareNatural(strA, strB, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase);
|
||||
|
||||
public static int CompareNatural(string strA, string strB, CultureInfo culture, CompareOptions options)
|
||||
{
|
||||
var cmp = culture.CompareInfo;
|
||||
var (iA, iB) = (0, 0);
|
||||
var softResult = 0;
|
||||
var softResultWeight = 0;
|
||||
var (iA, iB, softResult, softResultWeight) = (0, 0, 0, 0);
|
||||
while (iA < strA.Length && iB < strB.Length)
|
||||
{
|
||||
var isDigitA = char.IsDigit(strA[iA]);
|
||||
|
@ -64,8 +63,7 @@ namespace BFR.Operations
|
|||
return cmp.Compare(strA, iA, strB, iB, options);
|
||||
else if (!isDigitA && !isDigitB)
|
||||
{
|
||||
var jA = iA + 1;
|
||||
var jB = iB + 1;
|
||||
var (jA, jB) = (iA + 1, iB + 1);
|
||||
while (jA < strA.Length && !char.IsDigit(strA[jA])) jA++;
|
||||
while (jB < strB.Length && !char.IsDigit(strB[jB])) jB++;
|
||||
var cmpResult = cmp.Compare(strA, iA, jA - iA, strB, iB, jB - iB, options);
|
||||
|
@ -81,7 +79,8 @@ namespace BFR.Operations
|
|||
softResultWeight = 1;
|
||||
}
|
||||
}
|
||||
(iA, jA) = (iB, jB);
|
||||
iA = jA;
|
||||
iB = jB;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -90,7 +89,7 @@ namespace BFR.Operations
|
|||
var (jA, jB) = (iA, iB);
|
||||
while (jA < strA.Length && strA[jA] == zeroA) jA++;
|
||||
while (jB < strB.Length && strB[jB] == zeroB) jB++;
|
||||
int resultIfSameLength = 0;
|
||||
var resultIfSameLength = 0;
|
||||
do
|
||||
{
|
||||
isDigitA = jA < strA.Length && char.IsDigit(strA[jA]);
|
||||
|
@ -106,8 +105,7 @@ namespace BFR.Operations
|
|||
jA++;
|
||||
jB++;
|
||||
}
|
||||
}
|
||||
while (isDigitA && isDigitB);
|
||||
} while (isDigitA && isDigitB);
|
||||
if (isDigitA != isDigitB)
|
||||
return isDigitA ? 1 : -1;
|
||||
else if (resultIfSameLength != 0)
|
||||
|
|
Loading…
Reference in New Issue
Block a user