private void UpdateInventory()
{
List<byte> indexes = new();
for (int x = 0; x < Inventory.Count; x++)
{
if (!indexes.Contains(Inventory[x].ID))
{
indexes.Add(Inventory[x].ID);
for (int i = 0; i < Inventory.Count; i++)
{
if (x != i && Inventory[x].ID == Inventory[i].ID && Inventory[x].amount < 99)
{
if (Inventory[x].amount + Inventory[i].amount > 99)
{
Inventory[i].amount -= 99 - Inventory[x].amount;
Inventory[x].amount = 99;
}
else
{
Inventory[x].amount += Inventory[i].amount;
Inventory[i].amount = 0;
}
}
}
}
}
for (int i = 0; i < Inventory.Count; i++)
{
if (Inventory[i].amount <= 0)
{
Inventory.RemoveAt(i);
}
}
}
所以我试图让物品在库存中具有相同 ID 的其他物品之后进行检查,然后检查当前堆栈的数量以确保每个堆栈的最大数量为 99,然后将其他堆栈的数量添加到第一个堆栈,然后删除转移的金额,之后它会检查库存,以便如果任何堆栈的金额为 0,则会将其删除,但由于某种原因,它会以每个堆栈都为 0 结束。
我尝试过一个循环,其中每个堆栈检查除自身之外的所有堆栈,我尝试过一个循环,其中每个堆栈检查列表中自身之上的所有堆栈,然后图像是我最新的尝试,但没有任何效果。
第 144-150 行中的循环在迭代列表时从列表中删除项目,这就是剩余项目的原因。 让我们看一下更简单的伪代码并运行它:
var list = {1,2,3,4,5};
for (int i = 0; i < list.Count; i++) {
if (list[i] >= 0) {
list.RemoveAt(i);
}
}
现在让我们运行代码 -
i = 0
list = {1,2,3,4,5};
list[i] = 1 // >=0 , so it is removed
list = {2,3,4,5}
i = 1
list[i] = 3 // we skipped 2!!!!
因为您在修改列表时迭代列表,所以您正在跳过项目。 避免这种情况的最简单方法是,不从列表中删除项目,而是创建一个仅包含您要保留的项目的新列表。您可以使用 Linq 的
Where
函数,或显式执行此操作。
无论如何,最好的做法是将逻辑分成更小的块,并通过单元测试单独测试每个块,以便了解代码出了什么问题。