mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
Always use indexed removals
This commit is contained in:
@@ -438,7 +438,7 @@ namespace SabreTools.DatFiles.Test
|
|||||||
var dict = new ItemDictionary();
|
var dict = new ItemDictionary();
|
||||||
dict.AddItem(datItem, statsOnly: false);
|
dict.AddItem(datItem, statsOnly: false);
|
||||||
|
|
||||||
dict.RemoveItem("game-1", (Rom)datItem.Clone());
|
dict.RemoveItem("game-1", (Rom)datItem.Clone(), 0);
|
||||||
|
|
||||||
Assert.Empty(dict.GetItemsForBucket("default"));
|
Assert.Empty(dict.GetItemsForBucket("default"));
|
||||||
Assert.Empty(dict.GetItemsForBucket("game-1"));
|
Assert.Empty(dict.GetItemsForBucket("game-1"));
|
||||||
|
|||||||
@@ -1098,10 +1098,17 @@ namespace SabreTools.DatFiles
|
|||||||
// If the parent exists and has items, we remove the parent items 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)
|
foreach (DatItem item in parentItems)
|
||||||
{
|
{
|
||||||
var matchedItems = items.FindAll(i => i.Equals(item));
|
while (true)
|
||||||
foreach (var match in matchedItems)
|
|
||||||
{
|
{
|
||||||
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)
|
if (parentItems.Count == 0)
|
||||||
continue;
|
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)
|
foreach (DatItem item in parentItems)
|
||||||
{
|
{
|
||||||
var matchedItems = items.FindAll(i => i.Equals(item));
|
while (true)
|
||||||
foreach (var match in matchedItems)
|
|
||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -303,13 +303,14 @@ namespace SabreTools.DatFiles
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <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>
|
/// </summary>
|
||||||
/// <param name="key">Key in the dictionary to remove from</param>
|
/// <param name="key">Key in the dictionary to remove from</param>
|
||||||
/// <param name="value">Value to remove from the dictionary</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>
|
/// <summary>
|
||||||
|
|||||||
@@ -284,43 +284,7 @@ namespace SabreTools.DatFiles
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <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)
|
|
||||||
{
|
|
||||||
// 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
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="key">Key in the dictionary to remove from</param>
|
/// <param name="key">Key in the dictionary to remove from</param>
|
||||||
/// <param name="value">Value to remove from the dictionary</param>
|
/// <param name="value">Value to remove from the dictionary</param>
|
||||||
|
|||||||
Reference in New Issue
Block a user