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
}
///