diff --git a/SabreTools.Core/Tools/TextHelper.cs b/SabreTools.Core/Tools/TextHelper.cs index e53a39b8..5dadd54d 100644 --- a/SabreTools.Core/Tools/TextHelper.cs +++ b/SabreTools.Core/Tools/TextHelper.cs @@ -87,7 +87,7 @@ namespace SabreTools.Core.Tools if (string.IsNullOrEmpty(input)) return string.Empty; - return new string(input.Where(c => c <= 255).ToArray()); + return new string(input!.Where(c => c <= 255).ToArray()); } #endregion diff --git a/SabreTools.Core/Tools/TypeHelper.cs b/SabreTools.Core/Tools/TypeHelper.cs index 93f0bd02..999b03be 100644 --- a/SabreTools.Core/Tools/TypeHelper.cs +++ b/SabreTools.Core/Tools/TypeHelper.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Reflection; using System.Xml.Serialization; using SabreTools.Models; @@ -22,21 +21,13 @@ namespace SabreTools.Core.Tools if (fields == null) return null; -#if NET20 || NET35 || NET40 - return fields - .Where(f => f.IsLiteral && !f.IsInitOnly) - .Where(f => Attribute.GetCustomAttributes(f, typeof(NoFilterAttribute)).Length == 0) - .Select(f => f.GetRawConstantValue() as string) - .Where(v => v != null) - .ToArray()!; -#else - return fields - .Where(f => f.IsLiteral && !f.IsInitOnly) - .Where(f => !f.CustomAttributes.Any(a => a.AttributeType == typeof(NoFilterAttribute))) - .Select(f => f.GetRawConstantValue() as string) - .Where(v => v != null) - .ToArray()!; -#endif + FieldInfo[] noFilterFields = Array.FindAll(fields, + f => f.IsLiteral + && !f.IsInitOnly + && Attribute.GetCustomAttributes(f, typeof(NoFilterAttribute)).Length == 0); + string[] constantValues = Array.ConvertAll(noFilterFields, + f => (f.GetRawConstantValue() as string) ?? string.Empty); + return Array.FindAll(constantValues, s => s.Length > 0); } /// diff --git a/SabreTools.DatFiles/DatFile.FromMetadata.cs b/SabreTools.DatFiles/DatFile.FromMetadata.cs index 332dfe02..e93ae2a7 100644 --- a/SabreTools.DatFiles/DatFile.FromMetadata.cs +++ b/SabreTools.DatFiles/DatFile.FromMetadata.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using SabreTools.Core.Tools; using SabreTools.DatItems; @@ -270,8 +269,7 @@ namespace SabreTools.DatFiles } if (item.ContainsKey(Models.Metadata.Machine.DiskKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.DiskKey) - ?? ReadItemArray(item, Models.Metadata.Machine.DiskKey)?.Select(d => (d as Models.Metadata.Disk)!)?.ToArray(); // TODO: Remove case when Serialization fixed + var items = ReadItemArray(item, Models.Metadata.Machine.DiskKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.DisplayKey)) @@ -332,8 +330,7 @@ namespace SabreTools.DatFiles } if (item.ContainsKey(Models.Metadata.Machine.RomKey)) { - var items = ReadItemArray(item, Models.Metadata.Machine.RomKey) - ?? ReadItemArray(item, Models.Metadata.Machine.RomKey)?.Select(d => (d as Models.Metadata.Rom)!)?.ToArray(); // TODO: Remove case when Serialization fixed + var items = ReadItemArray(item, Models.Metadata.Machine.RomKey); ProcessItems(items, machine, machineIndex, source, sourceIndex, statsOnly); } if (item.ContainsKey(Models.Metadata.Machine.SampleKey)) diff --git a/SabreTools.DatFiles/DatFile.cs b/SabreTools.DatFiles/DatFile.cs index b2887c44..9dd58ff9 100644 --- a/SabreTools.DatFiles/DatFile.cs +++ b/SabreTools.DatFiles/DatFile.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core.Filter; @@ -829,7 +828,8 @@ namespace SabreTools.DatFiles // If we have an item type not in the list of supported values string datFormat = Header?.GetFieldValue(DatHeader.DatFormatKey).ToString() ?? "Unknown Format"; - if (!GetSupportedTypes().Contains(datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue())) + ItemType itemType = datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue(); + if (!Array.Exists(GetSupportedTypes(), t => t == itemType)) { string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {datFormat}"); @@ -898,7 +898,8 @@ namespace SabreTools.DatFiles // If we have an item type not in the list of supported values string datFormat = Header?.GetFieldValue(DatHeader.DatFormatKey).ToString() ?? "Unknown Format"; - if (!GetSupportedTypes().Contains(datItem.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue())) + ItemType itemType = datItem.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue(); + if (!Array.Exists(GetSupportedTypes(), t => t == itemType)) { string itemString = JsonConvert.SerializeObject(datItem, Formatting.None); logger?.Verbose($"Item '{itemString}' was skipped because it was not supported in {datFormat}"); diff --git a/SabreTools.DatFiles/ItemDictionary.cs b/SabreTools.DatFiles/ItemDictionary.cs index 3e2244bf..3229d090 100644 --- a/SabreTools.DatFiles/ItemDictionary.cs +++ b/SabreTools.DatFiles/ItemDictionary.cs @@ -434,10 +434,9 @@ namespace SabreTools.DatFiles return []; // Filter the list - return fi.Where(i => i != null) - .Where(i => i.GetBoolFieldValue(DatItem.RemoveKey) != true) - .Where(i => i.GetFieldValue(DatItem.MachineKey) != null) - .ToList(); + return fi.FindAll(i => i != null) + .FindAll(i => i.GetBoolFieldValue(DatItem.RemoveKey) != true) + .FindAll(i => i.GetFieldValue(DatItem.MachineKey) != null); } } @@ -1116,11 +1115,9 @@ namespace SabreTools.DatFiles if (datItem is Rom) { string[] splitname = machine.Split('.'); -#if NET20 || NET35 - machine = datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1).ToArray())}"; -#else - machine = datItem.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1))}"; -#endif + machine = datItem.GetFieldValue(DatItem.MachineKey)! + .GetStringFieldValue(Models.Metadata.Machine.NameKey) + + $"/{string.Join(".", splitname, 0, splitname.Length > 1 ? splitname.Length - 1 : 1)}"; } // Strip off "Default" prefix only for ORPG @@ -1254,17 +1251,17 @@ namespace SabreTools.DatFiles // Get all device reference names from the current machine List deviceReferences = this[machine]! - .Where(i => i is DeviceRef) - .Select(i => i as DeviceRef) - .Select(dr => dr!.GetName()) + .FindAll(i => i is DeviceRef) + .ConvertAll(i => i as DeviceRef) + .ConvertAll(dr => dr!.GetName()) .Distinct() .ToList(); // Get all slot option names from the current machine List slotOptions = this[machine]! - .Where(i => i is Slot) - .Select(i => i as Slot) - .Where(s => s!.SlotOptionsSpecified) + .FindAll(i => i is Slot) + .ConvertAll(i => i as Slot) + .FindAll(s => s!.SlotOptionsSpecified) .SelectMany(s => s!.GetFieldValue(Models.Metadata.Slot.SlotOptionKey)!) .Select(so => so.GetStringFieldValue(Models.Metadata.SlotOption.DevNameKey)) .Distinct() @@ -1287,15 +1284,15 @@ namespace SabreTools.DatFiles continue; newDeviceReferences.UnionWith(devItems - .Where(i => i is DeviceRef) - .Select(i => (i as DeviceRef)!.GetName()!)); + .FindAll(i => i is DeviceRef) + .ConvertAll(i => (i as DeviceRef)!.GetName()!)); // Set new machine information and add to the current machine DatItem copyFrom = this[machine]![0]; foreach (DatItem item in devItems) { // If the parent machine doesn't already contain this item, add it - if (!this[machine]!.Any(i => i.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) == item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) && i.GetName() == item.GetName())) + if (!this[machine]!.Exists(i => i.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) == item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) && i.GetName() == item.GetName())) { // Set that we found new items foundnew = true; @@ -1337,8 +1334,8 @@ namespace SabreTools.DatFiles continue; newSlotOptions.UnionWith(slotItems - .Where(i => i is Slot) - .Where(s => (s as Slot)!.SlotOptionsSpecified) + .FindAll(i => i is Slot) + .FindAll(s => (s as Slot)!.SlotOptionsSpecified) .SelectMany(s => (s as Slot)!.GetFieldValue(Models.Metadata.Slot.SlotOptionKey)!) .Select(o => o.GetStringFieldValue(Models.Metadata.SlotOption.DevNameKey)!)); @@ -1347,7 +1344,7 @@ namespace SabreTools.DatFiles foreach (DatItem item in slotItems) { // If the parent machine doesn't already contain this item, add it - if (!this[machine]!.Any(i => i.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) == item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) && i.GetName() == item.GetName())) + if (!this[machine]!.Exists(i => i.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) == item.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) && i.GetName() == item.GetName())) { // Set that we found new items foundnew = true; @@ -1486,16 +1483,16 @@ namespace SabreTools.DatFiles // If the merge tag exists and the parent already contains it, skip if (mergeTag != null && this[cloneOf!]! - .Where(i => i is Disk) - .Select(i => (i as Disk)!.GetName()).Contains(mergeTag)) + .FindAll(i => i is Disk) + .ConvertAll(i => (i as Disk)!.GetName()).Contains(mergeTag)) { continue; } // If the merge tag exists but the parent doesn't contain it, add to parent else if (mergeTag != null && !this[cloneOf!]! - .Where(i => i is Disk) - .Select(i => (i as Disk)!.GetName()).Contains(mergeTag)) + .FindAll(i => i is Disk) + .ConvertAll(i => (i as Disk)!.GetName()).Contains(mergeTag)) { disk.CopyMachineInformation(copyFrom); Add(cloneOf!, disk); @@ -1514,7 +1511,8 @@ namespace SabreTools.DatFiles { // If the merge tag exists and the parent already contains it, skip if (rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey) != null && this[cloneOf!]! - .Where(i => i is Rom).Select(i => (i as Rom)!.GetName()) + .FindAll(i => i is Rom) + .ConvertAll(i => (i as Rom)!.GetName()) .Contains(rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey))) { continue; @@ -1522,7 +1520,8 @@ namespace SabreTools.DatFiles // If the merge tag exists but the parent doesn't contain it, add to subfolder of parent else if (rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey) != null && !this[cloneOf!]! - .Where(i => i is Rom).Select(i => (i as Rom)!.GetName()) + .FindAll(i => i is Rom) + .ConvertAll(i => (i as Rom)!.GetName()) .Contains(rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey))) { if (subfolder) diff --git a/SabreTools.DatFiles/ItemDictionaryDB.cs b/SabreTools.DatFiles/ItemDictionaryDB.cs index 6309d104..53d459f4 100644 --- a/SabreTools.DatFiles/ItemDictionaryDB.cs +++ b/SabreTools.DatFiles/ItemDictionaryDB.cs @@ -302,7 +302,7 @@ namespace SabreTools.DatFiles #endif // If there are no non-blank items, remove - else if (!_buckets[key].Any(i => GetItem(i) != null && GetItem(i) is not Blank)) + else if (!_buckets[key].Exists(i => GetItem(i) != null && GetItem(i) is not Blank)) #if NET40_OR_GREATER || NETCOREAPP _buckets.TryRemove(key, out _); #else @@ -653,7 +653,8 @@ namespace SabreTools.DatFiles } // Add back all roms with the proper flags - _buckets[key] = output.Concat(left).Select(i => i.Item1).ToList(); + List<(long, DatItem)> combined = [.. output, .. left]; + _buckets[key] = combined.ConvertAll(i => i.Item1); return output; } @@ -699,7 +700,8 @@ namespace SabreTools.DatFiles } // Add back all roms with the proper flags - _buckets[key] = output.Concat(left).Select(i => i.Item1).ToList(); + List<(long, DatItem)> combined = [.. output, .. left]; + _buckets[key] = combined.ConvertAll(i => i.Item1); return output; } @@ -1110,13 +1112,12 @@ namespace SabreTools.DatFiles } var datItems = itemIndices - .Where(i => _items.ContainsKey(i)) - .Select(i => (i, _items[i])) - .ToList(); + .FindAll(i => _items.ContainsKey(i)) + .ConvertAll(i => (i, _items[i])); Sort(ref datItems, norename); - _buckets[bucketKeys[i]] = datItems.Select(m => m.Item1).ToList(); + _buckets[bucketKeys[i]] = datItems.ConvertAll(m => m.Item1); #if NET40_OR_GREATER || NETCOREAPP }); #else @@ -1532,11 +1533,9 @@ namespace SabreTools.DatFiles if (datItem.Item2 is Rom) { string[] splitname = machineName.Split('.'); -#if NET20 || NET35 - machineName = datItem.Item2.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1).ToArray())}"; -#else - machineName = datItem.Item2.GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) + $"/{string.Join(".", splitname.Take(splitname.Length > 1 ? splitname.Length - 1 : 1))}"; -#endif + machineName = datItem.Item2.GetFieldValue(DatItem.MachineKey)! + .GetStringFieldValue(Models.Metadata.Machine.NameKey) + + $"/{string.Join(".", splitname, 0, splitname.Length > 1 ? splitname.Length - 1 : 1)}"; } // Strip off "Default" prefix only for ORPG @@ -1682,18 +1681,19 @@ namespace SabreTools.DatFiles continue; // Get all device reference names from the current machine - List deviceReferences = items - .Where(i => i.Item2 is DeviceRef) - .Select(i => i.Item2 as DeviceRef) - .Select(dr => dr!.GetName()) + List<(long, DatItem)> itemsList = [.. items]; + List deviceReferences = itemsList + .FindAll(i => i.Item2 is DeviceRef) + .ConvertAll(i => i.Item2 as DeviceRef) + .ConvertAll(dr => dr!.GetName()) .Distinct() .ToList(); // Get all slot option names from the current machine - List slotOptions = items - .Where(i => i.Item2 is Slot) - .Select(i => i.Item2 as Slot) - .Where(s => s!.SlotOptionsSpecified) + List slotOptions = itemsList + .FindAll(i => i.Item2 is Slot) + .ConvertAll(i => i.Item2 as Slot) + .FindAll(s => s!.SlotOptionsSpecified) .SelectMany(s => s!.GetFieldValue(Models.Metadata.Slot.SlotOptionKey)!) .Select(so => so.GetStringFieldValue(Models.Metadata.SlotOption.DevNameKey)) .Distinct() @@ -1716,20 +1716,21 @@ namespace SabreTools.DatFiles continue; // Add to the list of new device reference names - newDeviceReferences.UnionWith(devItems - .Where(i => i.Item2 is DeviceRef) - .Select(i => (i.Item2 as DeviceRef)!.GetName()!)); + List<(long, DatItem)> devItemsList = [.. devItems]; + newDeviceReferences.UnionWith(devItemsList + .FindAll(i => i.Item2 is DeviceRef) + .ConvertAll(i => (i.Item2 as DeviceRef)!.GetName()!)); // Set new machine information and add to the current machine - var copyFrom = GetMachineForItem(GetItemsForBucket(game)![0].Item1); + var copyFrom = GetMachineForItem(items[0].Item1); if (copyFrom.Item2 == null) continue; foreach ((long, DatItem) item in devItems) { // If the parent machine doesn't already contain this item, add it - if (!GetItemsForBucket(game)! - .Any(i => i.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) == item.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) + if (!Array.Exists(items, + i => i.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) == item.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) && i.Item2.GetName() == item.Item2.GetName())) { // Set that we found new items @@ -1771,9 +1772,10 @@ namespace SabreTools.DatFiles continue; // Add to the list of new slot option names - newSlotOptions.UnionWith(slotItems - .Where(i => i.Item2 is Slot) - .Where(s => (s.Item2 as Slot)!.SlotOptionsSpecified) + List<(long, DatItem)> slotItemsList = [.. slotItems]; + newSlotOptions.UnionWith(slotItemsList + .FindAll(i => i.Item2 is Slot) + .FindAll(s => (s.Item2 as Slot)!.SlotOptionsSpecified) .SelectMany(s => (s.Item2 as Slot)!.GetFieldValue(Models.Metadata.Slot.SlotOptionKey)!) .Select(o => o.GetStringFieldValue(Models.Metadata.SlotOption.DevNameKey)!)); @@ -1785,8 +1787,8 @@ namespace SabreTools.DatFiles foreach ((long, DatItem) item in slotItems) { // If the parent machine doesn't already contain this item, add it - if (!GetItemsForBucket(game)! - .Any(i => i.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) == item.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) + if (!Array.Exists(items, + i => i.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) == item.Item2.GetStringFieldValue(Models.Metadata.DatItem.TypeKey) && i.Item2.GetName() == item.Item2.GetName())) { // Set that we found new items @@ -1915,9 +1917,10 @@ namespace SabreTools.DatFiles { // Get the parent items and current machine name var parentItems = GetItemsForBucket(cloneOf!); - if (parentItems == null) + if (parentItems == null || parentItems.Length == 0) continue; + List<(long, DatItem)> parentItemslist = [.. parentItems]; string? machineName = GetMachineForItem(item.Item1).Item2?.GetStringFieldValue(Models.Metadata.Machine.NameKey); // Special disk handling @@ -1926,18 +1929,18 @@ namespace SabreTools.DatFiles string? mergeTag = disk.GetStringFieldValue(Models.Metadata.Disk.MergeKey); // If the merge tag exists and the parent already contains it, skip - if (mergeTag != null && parentItems - .Where(i => i.Item2 is Disk) - .Select(i => (i.Item2 as Disk)!.GetName()) + if (mergeTag != null && parentItemslist + .FindAll(i => i.Item2 is Disk) + .ConvertAll(i => (i.Item2 as Disk)!.GetName()) .Contains(mergeTag)) { continue; } // If the merge tag exists but the parent doesn't contain it, add to parent - else if (mergeTag != null && !parentItems - .Where(i => i.Item2 is Disk) - .Select(i => (i.Item2 as Disk)!.GetName()) + else if (mergeTag != null && !parentItemslist + .FindAll(i => i.Item2 is Disk) + .ConvertAll(i => (i.Item2 as Disk)!.GetName()) .Contains(mergeTag)) { _itemToMachineMapping[item.Item1] = cloneOfMachine.Item1; @@ -1956,18 +1959,18 @@ namespace SabreTools.DatFiles else if (item.Item2 is Rom rom) { // If the merge tag exists and the parent already contains it, skip - if (rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey) != null && parentItems - .Where(i => i.Item2 is Rom) - .Select(i => (i.Item2 as Rom)!.GetName()) + if (rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey) != null && parentItemslist + .FindAll(i => i.Item2 is Rom) + .ConvertAll(i => (i.Item2 as Rom)!.GetName()) .Contains(rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey))) { continue; } // If the merge tag exists but the parent doesn't contain it, add to subfolder of parent - else if (rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey) != null && !parentItems - .Where(i => i.Item2 is Rom) - .Select(i => (i.Item2 as Rom)!.GetName()) + else if (rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey) != null && !parentItemslist + .FindAll(i => i.Item2 is Rom) + .ConvertAll(i => (i.Item2 as Rom)!.GetName()) .Contains(rom.GetStringFieldValue(Models.Metadata.Rom.MergeKey))) { if (subfolder) @@ -1989,7 +1992,7 @@ namespace SabreTools.DatFiles } // All other that would be missing to subfolder of parent - else if (Array.IndexOf(parentItems, item) == -1) + else if (parentItemslist.IndexOf(item) == -1) { if (subfolder) item.Item2.SetName($"{machineName}\\{item.Item2.GetName()}"); diff --git a/SabreTools.FileTypes/Archives/GZipArchive.cs b/SabreTools.FileTypes/Archives/GZipArchive.cs index bf000792..e1472515 100644 --- a/SabreTools.FileTypes/Archives/GZipArchive.cs +++ b/SabreTools.FileTypes/Archives/GZipArchive.cs @@ -462,10 +462,7 @@ namespace SabreTools.FileTypes.Archives BinaryWriter sw = new(outputStream); // Write standard header and TGZ info - byte[] data = TorrentGZHeader - .Concat(baseFile.MD5!) // MD5 - .Concat(baseFile.CRC!) // CRC - .ToArray(); + byte[] data = [.. TorrentGZHeader, .. baseFile.MD5!, .. baseFile.CRC!]; sw.Write(data); sw.Write((ulong)(baseFile.Size ?? 0)); // Long size (Unsigned, Mirrored)