Always use indexed removals

This commit is contained in:
Matt Nadareski
2025-05-03 23:20:23 -04:00
parent 8b618cea48
commit c6b3b9af80
4 changed files with 27 additions and 48 deletions

View File

@@ -1098,10 +1098,17 @@ namespace SabreTools.DatFiles
// If the parent exists and has items, we remove the parent items from the current game
foreach (DatItem item in parentItems)
{
var matchedItems = items.FindAll(i => i.Equals(item));
foreach (var match in matchedItems)
while (true)
{
RemoveItem(bucket, match);
// Reset the items list each time an item is removed so the index is accurate
items = GetItemsForBucket(bucket);
// Find the next index that matches the item
int index = items.FindIndex(i => i.Equals(item));
if (index < 0)
break;
RemoveItem(bucket, items[index], index);
}
}
@@ -1199,13 +1206,20 @@ namespace SabreTools.DatFiles
if (parentItems.Count == 0)
continue;
// If the parent exists and has items, we remove the items that are in the parent from the current game
// If the parent exists and has items, we remove the parent items from the current game
foreach (DatItem item in parentItems)
{
var matchedItems = items.FindAll(i => i.Equals(item));
foreach (var match in matchedItems)
while (true)
{
RemoveItem(bucket, match);
// Reset the items list each time an item is removed so the index is accurate
items = GetItemsForBucket(bucket);
// Find the next index that matches the item
int index = items.FindIndex(i => i.Equals(item));
if (index < 0)
break;
RemoveItem(bucket, items[index], index);
}
}
}

View File

@@ -303,13 +303,14 @@ namespace SabreTools.DatFiles
}
/// <summary>
/// Remove the first instance of a value from the file dictionary if it exists
/// Remove the indexed instance of a value from the file dictionary if it exists
/// </summary>
/// <param name="key">Key in the dictionary to remove from</param>
/// <param name="value">Value to remove from the dictionary</param>
public bool RemoveItem(string key, DatItem value)
/// <param name="index">Index of the item to be removed</param>
public bool RemoveItem(string key, DatItem value, int index)
{
return Items.RemoveItem(key, value);
return Items.RemoveItem(key, value, index);
}
/// <summary>

View File

@@ -284,43 +284,7 @@ namespace SabreTools.DatFiles
}
/// <summary>
/// Remove the first instance of a value from the file dictionary if it exists
/// </summary>
/// <param name="key">Key in the dictionary to remove from</param>
/// <param name="value">Value to remove from the dictionary</param>
public bool RemoveItem(string key, DatItem value)
{
// Explicit lock for some weird corner cases
lock (key)
{
// If the key doesn't exist, return
#if NET40_OR_GREATER || NETCOREAPP
if (!_items.TryGetValue(key, out var list) || list == null)
return false;
#else
if (!_items.ContainsKey(key))
return false;
var list = _items[key];
if (list == null)
return false;
#endif
// If the value doesn't exist in the key, assume it has been removed
int removeIndex = list.FindIndex(i => i.Equals(value));
if (removeIndex < 0)
return false;
// Remove the statistics first
DatStatistics.RemoveItemStatistics(value);
list.RemoveAt(removeIndex);
return true;
}
}
/// <summary>
/// Remove the first instance of a value from the file dictionary if it exists
/// Remove the indexed instance of a value from the file dictionary if it exists
/// </summary>
/// <param name="key">Key in the dictionary to remove from</param>
/// <param name="value">Value to remove from the dictionary</param>