diff --git a/SabreTools.Core/Filter/FilterRunner.cs b/SabreTools.Core/Filter/FilterRunner.cs index 1aec568f..28cd3aca 100644 --- a/SabreTools.Core/Filter/FilterRunner.cs +++ b/SabreTools.Core/Filter/FilterRunner.cs @@ -15,6 +15,11 @@ namespace SabreTools.Core.Filter /// public readonly FilterObject[] Filters; + /// + /// Cached item type names for filter selection + /// + private readonly string[] _datItemTypeNames = TypeHelper.GetDatItemTypeNames(); + public FilterRunner(FilterObject[] filters) { Filters = filters; @@ -54,7 +59,7 @@ namespace SabreTools.Core.Filter foreach (var filter in Filters) { // Skip filters not applicable to the item - if (filter.Key.ItemName == "item" && Array.IndexOf(TypeHelper.GetDatItemTypeNames(), itemName) == -1) + if (filter.Key.ItemName == "item" && Array.IndexOf(_datItemTypeNames, itemName) == -1) continue; else if (filter.Key.ItemName != "item" && filter.Key.ItemName != itemName) continue; diff --git a/SabreTools.DatFiles/ItemDictionary.cs b/SabreTools.DatFiles/ItemDictionary.cs index 1aeb5eb5..e281d6d3 100644 --- a/SabreTools.DatFiles/ItemDictionary.cs +++ b/SabreTools.DatFiles/ItemDictionary.cs @@ -203,19 +203,23 @@ namespace SabreTools.DatFiles /// public void ClearMarked() { - foreach (string key in SortedKeys) + string[] keys = [.. SortedKeys]; +#if NET452_OR_GREATER || NETCOREAPP + Parallel.ForEach(keys, Core.Globals.ParallelOptions, key => +#elif NET40_OR_GREATER + Parallel.ForEach(keys, key => +#else + foreach (var key in keys) +#endif { - // Get the unfiltered list - List list = GetItemsForBucket(key, filter: false); - - foreach (DatItem datItem in list) - { - if (datItem.GetBoolFieldValue(DatItem.RemoveKey) != true) - continue; - - RemoveItem(key, datItem); - } + var list = GetItemsForBucket(key, filter: true); + RemoveBucket(key); + list.ForEach(item => AddItem(key, item)); +#if NET40_OR_GREATER || NETCOREAPP + }); +#else } +#endif } ///