Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环冲突逻辑错误_C#_Loops_For Loop - Fatal编程技术网

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时的一个问题,确实如此。而且性能也更好。