C# 索引超出范围错误
我已经找了几天为什么我收到这个错误消息的原因了!我需要帮助来解决这个问题或者改进代码。很难理解为什么会发生这种错误,也很难找到原因,因为它只是偶尔发生,而不是一直发生!但我的猜测是,这与列表和列表中项目的数量有关。错误事件发生在代码的第二部分。我还尝试在一个特殊的“删除列表”中添加我想要删除的对象,但为什么这不起作用呢?谢谢你的帮助!谢谢C# 索引超出范围错误,c#,C#,我已经找了几天为什么我收到这个错误消息的原因了!我需要帮助来解决这个问题或者改进代码。很难理解为什么会发生这种错误,也很难找到原因,因为它只是偶尔发生,而不是一直发生!但我的猜测是,这与列表和列表中项目的数量有关。错误事件发生在代码的第二部分。我还尝试在一个特殊的“删除列表”中添加我想要删除的对象,但为什么这不起作用呢?谢谢你的帮助!谢谢 public void CollisionControlMissileHitAsteroid(ContentManager content) { fo
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--;
}
}
}
}
}
public void CollisionControlMissileHitAsteroid(ContentManager内容)
{
对于(int i=0;i0&&ssmallsist.Count>0)
{
for(int k=0;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; // ???????
}
}
}
if(missilesList.Count()>0&&ssmallsist.Count()>0)
{
for(int k=0;k
假设你从一枚导弹和两颗小行星出发。导弹(i=0)击中了第一颗小行星(j=0)——但你要继续i=-1和j=0。您应该打破内部循环,并在那里继续外部循环的下一次迭代。毕竟,你已经“完成”了导弹——它不能击中任何其他小行星,无论大小
(是的,根据xanatos的评论,使用
Count
属性而不是Count()
方法更为惯用。)您认为这与列表的边界有关,这是正确的。我从来没有想出过一种令人满意的方法来删除循环中的列表项或数组元素,就像你说的,除了建立索引列表并将它们删除到循环之外。
话虽如此,你有没有试着倒着看这个列表,比如-
for (int k = asteroidsSmallList.Count() - 1; k >= 0; k--)
{
...
我认为问题是显而易见的,因为您的代码运行在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--;
}
}
for(int i=0;i
您是否尝试在调试器中运行此功能?使用Count()
是否正确?您应仅将其用于不属于列表的IEnumerable
…错误消息为:索引超出范围。必须为非负数且小于collection@xanatos:它是正确的-只是不惯用。它会工作得很好,不会是O(n)或任何疯狂的东西。我错过了计数后的“()”!它应该是计数()我添加了中断,但我不确定它是否是正确的位置,因为它仍然会发生?嗯,但是如果我在我之前使用:if(missileList.Count()>0),那么就永远不会有-1?!这行得通吗?if(missileList.ElementAt(I).Bounds().Intersects(asterossmalllist.ElementAt(k).Bounds())//如果我是上一个for循环中的-1,在该循环中,i和jSorry递减,但我不知道如何解决这个问题!如果我阻止它在值不大于0时递减,它会是-1吗?没错。“.Count”返回元素数(不计算元素零)所以如果你想一个接一个地遍历这些项,你应该从中减去1