[DatFile] File ordering should use Natural comparisons

This commit is contained in:
Matt Nadareski
2017-06-01 13:09:34 -07:00
parent fc1fddf030
commit 5f8cfc418e
3 changed files with 14 additions and 24 deletions

View File

@@ -47,13 +47,7 @@ namespace SabreTools.Library.Dats
if (merge || (diff != 0 && (diff & DiffMode.Against) == 0)) if (merge || (diff != 0 && (diff & DiffMode.Against) == 0))
{ {
// Make sure there are no folders in inputs // Make sure there are no folders in inputs
List<string> newInputFileNames = FileTools.GetOnlyFilesFromInputs(inputPaths, appendparent: true); List<string> newInputFileNames = FileTools.GetOnlyFilesFromInputs(inputPaths, appendparent: true, reverse: (diff & DiffMode.ReverseCascade) != 0);
// If we're in inverse cascade, reverse the list
if ((diff & DiffMode.ReverseCascade) != 0)
{
newInputFileNames.Reverse();
}
// Create a dictionary of all ROMs from the input DATs // Create a dictionary of all ROMs from the input DATs
List<DatFile> datHeaders = PopulateUserData(newInputFileNames, inplace, clean, List<DatFile> datHeaders = PopulateUserData(newInputFileNames, inplace, clean,

View File

@@ -407,9 +407,10 @@ namespace SabreTools.Library.Tools
/// Retrieve a list of just files from inputs /// Retrieve a list of just files from inputs
/// </summary> /// </summary>
/// <param name="inputs">List of strings representing directories and files</param> /// <param name="inputs">List of strings representing directories and files</param>
/// <param name="appendparent">True if the parent name should be appended after the special character "¬", false otherwise</param> /// <param name="appendparent">True if the parent name should be appended after the special character "¬", false otherwise (default)</param>
/// <param name="reverse">True if the order output should be reversed, false otherwise (default)</param>
/// <returns>List of strings representing just files from the inputs</returns> /// <returns>List of strings representing just files from the inputs</returns>
public static List<string> GetOnlyFilesFromInputs(List<string> inputs, bool appendparent = false) public static List<string> GetOnlyFilesFromInputs(List<string> inputs, bool appendparent = false, bool reverse = false)
{ {
List<string> outputs = new List<string>(); List<string> outputs = new List<string>();
foreach (string input in inputs) foreach (string input in inputs)
@@ -417,9 +418,6 @@ namespace SabreTools.Library.Tools
if (Directory.Exists(input)) if (Directory.Exists(input))
{ {
List<string> files = FileTools.RetrieveFiles(input, new List<string>()); List<string> files = FileTools.RetrieveFiles(input, new List<string>());
// Make sure the files in the directory are ordered correctly
files = Style.OrderByAlphaNumeric(files, s => s).ToList();
foreach (string file in files) foreach (string file in files)
{ {
try try
@@ -453,6 +451,16 @@ namespace SabreTools.Library.Tools
} }
} }
// Make sure the outputs are ordered correctly
if (reverse)
{
outputs.Sort(new NaturalReversedComparer());
}
else
{
outputs.Sort(new NaturalComparer());
}
return outputs; return outputs;
} }

View File

@@ -954,18 +954,6 @@ namespace SabreTools.Library.Tools
return localTime; return localTime;
} }
/// <summary>
/// http://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp
/// </summary>
public static IEnumerable<T> OrderByAlphaNumeric<T>(this IEnumerable<T> source, Func<T, string> selector)
{
int max = source
.SelectMany(i => Regex.Matches(selector(i), @"\d+").Cast<Match>().Select(m => (int?)m.Value.Length))
.Max() ?? 0;
return source.OrderBy(i => Regex.Replace(selector(i), @"\d+", m => m.Value.PadLeft(max, '0')));
}
#endregion #endregion
} }
} }