如何引用List中的值,不包括当前元素

时间:2017-03-31 23:57:28

标签: c# .net xna

所以这应该很容易解决,但我无法弄明白。 (我在2015年的Visual Studios中使用XNA。我知道它有点过时了)

我拥有的是敌人名单(来自敌人类)。每个敌人都被分配一个碰撞矩形,如果一个敌人与另一个敌人的碰撞盒相交,他们就会停止移动。 我想使用类似于for循环的东西。

for (int i = 0; i < spawnAmount; i++)
{
    if (enemies[i].collisionRect.Intersects(enemies[].collisionRect))
        enemies[i].allActive = false;
}

所以在空白区域(敌人[]应该有一个值),有没有办法使用敌人列表中的所有值(即敌人[1,2,3,4,5])减去敌人[i]?否则敌人会检测到自己的碰撞盒并且无论如何都要停下来。它不必局限于几行,但越不复杂越好。

2 个答案:

答案 0 :(得分:2)

嵌套循环......

for (int i = 0; i < spawnAmount - 1; i++)
{
   for (int j = i + 1; j < spawnAmount; j++)
   {
       if (enemies[i].collisionRect.Intersects(enemies[j].collisionRect))
       {
           enemies[i].allActive = false;
       }
   }
}

所以你开始经历敌人。假设spawnAmount是5。

因此,对于i = 0,您需要比较0 -> 10 -> 20 -> 30 -> 4

i = 1,您比较1 -> 21 -> 31 -> 4

i = 2,您比较2 -> 32 -> 4

i = 3,您比较3 -> 4

您不需要对i=4的任何内容进行比较,因为无论如何您都会覆盖它们,因为每次迭代都会在j开始i+1,它们永远不会无论如何都是一样的。

答案 1 :(得分:0)

您想使用Except LINQ扩展名(来自System.Linq)。

唯一的问题是你需要传递一个集合,所以你的代码应该是这样的:

Enemy[] exclusionList = new Enemy[1]; //Construct outside of loop for efficiency
for (int i = 0; i < spawnAmount; i++)
{
    Enemy currentEnemy = enemies[i];
    exclusionList[0] = currentEnemy;
    if (enemies.Except(exclusionList).Any(e => e.collisionRect.Intersects(currentEnemy.collisionRect))
        enemies[i].allActive = false;
}

您可以完全用一些聪明的LINQ替换for循环,并且还应该考虑将远处的敌人添加到排除列表中,因为您显然不会与他们冲突

@MattWhitfields答案实际上更有效率,因为此代码将敌人1与敌人0 相反,反之亦然,这绝对不是必需的。您可以构建一个更聪明的排除列表来解决此问题,或者使用他描述的for循环。