C# 循环冲突逻辑错误
我有一个循环,用来检测和删除列表中与放置的对象相交的任何对象。代码如下:C# 循环冲突逻辑错误,c#,loops,for-loop,C#,Loops,For Loop,我有一个循环,用来检测和删除列表中与放置的对象相交的任何对象。代码如下: for (int i = 0; i < levelObjects.Count(); i++) { if (levelObjects[i].BoundingBox.Intersects(mouseBlock.BoundingBox)) { levelObjects.RemoveAt(i); } } 当遇到多个碰撞的情况时,它有时无法检测到碰撞。交集函数工作正常。我的循环是什么导
for (int i = 0; i < levelObjects.Count(); i++)
{
if (levelObjects[i].BoundingBox.Intersects(mouseBlock.BoundingBox))
{
levelObjects.RemoveAt(i);
}
}
当遇到多个碰撞的情况时,它有时无法检测到碰撞。交集函数工作正常。我的循环是什么导致了这种情况?当删除索引i处的对象时,索引i+1处的值向下滑动到索引i。循环将移动到索引i+1,并且从不检查索引i处的新值。只需向后循环即可避免这种情况。删除索引i处的对象时,索引i+1处的值向下滑动到索引i。循环将移动到索引i+1,并且从不检查索引i处的新值。您可以通过简单地向后循环来避免这种情况。因为您要从循环中删除元素,所以最终会跳过元素。更好的选择是向后循环:
for (int i=levelObjects.Count() - 1; i >= 0; --i)
{
// ...
这可以防止您现在缺少的跳过对象,因为当您删除时,索引向下移动,您只移动您已经测试过的对象。由于您从循环中删除,您最终会跳过元素。更好的选择是向后循环:
for (int i=levelObjects.Count() - 1; i >= 0; --i)
{
// ...
这可以防止您现在缺少的跳过对象,因为当您删除并且索引向下移动时,您只会移动您已经测试过的对象。您无法从正在迭代的列表中删除!迭代副本或创建要删除的项列表,然后再删除它们。如果性能不是问题,则示例:
foreach (var obj in levelObjects.ToList())
{
if (obj.BoundingBox.Intersects(mouseBlock.BoundingBox))
{
levelObjects.Remove(obj);
}
}
您不能从正在迭代的列表中删除!迭代副本或创建要删除的项列表,然后再删除它们。如果性能不是问题,则示例:
foreach (var obj in levelObjects.ToList())
{
if (obj.BoundingBox.Intersects(mouseBlock.BoundingBox))
{
levelObjects.Remove(obj);
}
}
移除索引i处的levelObject时,将所有内容向下移动一个索引。因此,下一项现在位于索引i。避免这种情况的一个简单方法是从结尾开始,然后倒转,即
for (int i = levelObjectsCount - 1; i >= 0; i--)
{
if (levelObjects[i].BoundingBox.Intersects(mouseBlock.BoundingBox))
{
levelObjects.RemoveAt(i);
}
}
移除索引i处的levelObject时,将所有内容向下移动一个索引。因此,下一项现在位于索引i。避免这种情况的一个简单方法是从结尾开始,然后倒转,即
for (int i = levelObjectsCount - 1; i >= 0; i--)
{
if (levelObjects[i].BoundingBox.Intersects(mouseBlock.BoundingBox))
{
levelObjects.RemoveAt(i);
}
}
当未命中时,您可以跟踪边界框的属性吗?当未命中时,您可以跟踪边界框的属性吗?您可以删除正在使用for循环进行迭代的对象。。。你只需要正确处理索引。删除只是使用foreachYes时的一个问题,确实如此。而且性能也更好。您可以删除正在使用for循环进行迭代的对象。。。你只需要正确处理索引。删除只是使用foreachYes时的一个问题,确实如此。而且性能也更好。