索引超出范围错误

时间:2012-07-19 09:00:44

标签: c#

我一直在寻找为什么会在几天内收到此错误消息的原因!我需要帮助来解决这个问题或改进代码。很难理解为什么会发生这种错误并找到原因,有时它会发生,而不是所有时间!但我的猜测是它与列表和列表中的项目数量有关。它位于错误事件发生的代码的第二部分。我还试图在一个特殊的“删除列表”中添加我想要删除的对象,但为什么这不起作用?感谢帮助!谢谢!

public void CollisionControlMissileHitAsteroid(ContentManager content)
{
    for (int i = 0; i < missilesList.Count(); i++)
    {
        // Stora asteroider
        for (int j = 0; j < asteroidsBigList.Count(); j++)
        {
            if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsBigList.ElementAt(j).Bounds())) // Fel här ??
            {

                for(int x = 0; x < 2; x++)
                AddNewSmallAsteroidToList(new AsteroidSmall(content, asteroidsBigList.ElementAt(j).Position));
                missilesList.RemoveAt(i);
                i--;

                asteroidsBigList.RemoveAt(j);
                j--;
            }
        }


        if (missilesList.Count() > 0 && asteroidsSmallList.Count > 0)
        {

            for (int k = 0; k < asteroidsSmallList.Count(); k++) 
            {
                if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsSmallList.ElementAt(k).Bounds())) // THIS IS WHERE THE ERROR EVENT HAPPENS!
                {
                    missilesList.RemoveAt(i);
                    i--;
                    asteroidsSmallList.RemoveAt(k); 
                    k--;
                }
            }
        }
    } 
}

编辑:

这是我应该休息的地方吗?问,因为它仍然发生!我可以玩五分钟直到它发生!

if (missilesList.Count() > 0 && asteroidsSmallList.Count() > 0)
{

    for (int k = 0; k < asteroidsSmallList.Count(); k++) 
    {
        if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsSmallList.ElementAt(k).Bounds())) 
        {
            missilesList.RemoveAt(i); 
            i--;
            asteroidsSmallList.RemoveAt(k);
            k--;
            break; // ???????
        }
    }
}

3 个答案:

答案 0 :(得分:1)

你认为这与列表的界限有关是正确的。我从来没有想出一种令人满意的方法来删除循环中的listitems或数组元素,正如你所说的那样,构建一个索引列表并将它们移出循环之外。 话虽如此,你是否尝试过倒退,如 -

for (int k = asteroidsSmallList.Count() - 1; k >= 0; k--) 
{
    ...

答案 1 :(得分:0)

假设您从一枚导弹和两颗小行星开始。导弹(i = 0)撞击第一个小行星(j = 0) - 但是你继续i = -1和j = 0。你应该突破内循环并继续外循环的下一次迭代。毕竟,你已经完成导弹 - 它无法击中任何其他小行星,无论大小。

(是的,根据xanatos的评论,使用Count属性而不是Count()方法会更加惯用。)

答案 2 :(得分:0)

我认为问题很明显,因为你的代码在for循环中运行。在第一个for循环中,您获得了i=0。阅读我在

中的评论
for (int i = 0; i < missilesList.Count(); i++)
    {
        // Stora asteroider
        for (int j = 0; j < asteroidsBigList.Count(); j++)
        {
            if (missilesList.ElementAt(i).Bounds().Intersects(asteroidsBigList.ElementAt(j).Bounds())) // Fel här ??
            {

                for(int x = 0; x < 2; x++)
                    AddNewSmallAsteroidToList(new AsteroidSmall(content, asteroidsBigList.ElementAt(j).Position));
                missilesList.RemoveAt(i);
                // In the first iteration of the outer for loop i=0, so what if the line below is executed
                // you will get negative index Hope this help
                i--;

                asteroidsBigList.RemoveAt(j);
                j--;
            }
        }