我的入栈算法有什么问题?统一c#

问题描述 投票:0回答:1

My algorithm

 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 结束。

我尝试过一个循环,其中每个堆栈检查除自身之外的所有堆栈,我尝试过一个循环,其中每个堆栈检查列表中自身之上的所有堆栈,然后图像是我最新的尝试,但没有任何效果。

c# unity-game-engine
1个回答
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
函数,或显式执行此操作。

无论如何,最好的做法是将逻辑分成更小的块,并通过单元测试单独测试每个块,以便了解代码出了什么问题。

© www.soinside.com 2019 - 2024. All rights reserved.