diff --git a/SabreTools.DatItems/DatItem.cs b/SabreTools.DatItems/DatItem.cs index 2ee8ffd6..0adc4380 100644 --- a/SabreTools.DatItems/DatItem.cs +++ b/SabreTools.DatItems/DatItem.cs @@ -620,26 +620,33 @@ namespace SabreTools.DatItems { try { - NaturalComparer nc = new(); + var nc = new NaturalComparer(); + + // Get all required values + string? xDirectoryName = Path.GetDirectoryName(TextHelper.RemovePathUnsafeCharacters(x.GetName() ?? string.Empty)); + string? xMachineName = x.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey); + string? xName = Path.GetFileName(TextHelper.RemovePathUnsafeCharacters(x.GetName() ?? string.Empty)); + int? xSourceIndex = x.GetFieldValue(DatItem.SourceKey)?.Index; + string? xType = x.GetStringFieldValue(Models.Metadata.DatItem.TypeKey); + + string? yDirectoryName = Path.GetDirectoryName(TextHelper.RemovePathUnsafeCharacters(y.GetName() ?? string.Empty)); + string? yMachineName = y.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey); + string? yName = Path.GetFileName(TextHelper.RemovePathUnsafeCharacters(y.GetName() ?? string.Empty)); + int? ySourceIndex = y.GetFieldValue(DatItem.SourceKey)?.Index; + string? yType = y.GetStringFieldValue(Models.Metadata.DatItem.TypeKey); // If machine names match, more refinement is needed - if (x.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) == y.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)) + if (xMachineName == yMachineName) { // If item types match, more refinement is needed - if (x.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) == y.GetStringFieldValue(Models.Metadata.DatItem.TypeKey)) + if (xType == yType) { - string? xDirectoryName = Path.GetDirectoryName(TextHelper.RemovePathUnsafeCharacters(x.GetName() ?? string.Empty)); - string? yDirectoryName = Path.GetDirectoryName(TextHelper.RemovePathUnsafeCharacters(y.GetName() ?? string.Empty)); - // If item directory names match, more refinement is needed if (xDirectoryName == yDirectoryName) { - string? xName = Path.GetFileName(TextHelper.RemovePathUnsafeCharacters(x.GetName() ?? string.Empty)); - string? yName = Path.GetFileName(TextHelper.RemovePathUnsafeCharacters(y.GetName() ?? string.Empty)); - // If item names match, then compare on machine or source, depending on the flag if (xName == yName) - return (norename ? nc.Compare(x.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey), y.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)) : (x.GetFieldValue(DatItem.SourceKey)?.Index - y.GetFieldValue(DatItem.SourceKey)?.Index) ?? 0); + return (norename ? nc.Compare(xMachineName, yMachineName) : (xSourceIndex - ySourceIndex) ?? 0); // Otherwise, just sort based on item names return nc.Compare(xName, yName); @@ -650,11 +657,11 @@ namespace SabreTools.DatItems } // Otherwise, just sort based on item type - return x.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue() - y.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue(); + return xType.AsEnumValue() - yType.AsEnumValue(); } // Otherwise, just sort based on machine name - return nc.Compare(x.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey), y.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey)); + return nc.Compare(xMachineName, yMachineName); } catch {