获取列表 C# 中的后续元素

Get subsequent element in list C#

有人要求我改进给定的一段代码。该代码的想法是获取一个对象列表,并使用两个 foreach 循环检查它们是否发生碰撞。伪写的代码:

foreach (Entity object in objectList) 
    foreach (Entity object2 in objectList)
        if (object.collideWith(object2))
            Collision(object,object2)

对于每个对象,它循环遍历每个对象 - 这效率不高。相反,我应该将其更改为 "For each object, loop over every subsequent object"。我对 C# 还很陌生,但这就是我用伪造的方式想象解决方案的方式:

foreach (Entity object in objectList) 
    if (object.collideWith(subsequent object))
        Collision(object, subsequent object)

这样,我只检查一个对象是否与另一个对象碰撞一次。但是如何在我的列表中获得 "subsequent object" 呢?

"For each object, loop over every subsequent object"

for (int i = 0; i < objectList.Count - 1; i++)
{
  for (int j = i+1; j < objectList.Count; j++)
  {
    var obj1 = objectList[i];
    var obj2 = objectList[j];

    if (obj1.collideWith(obj2))
      Collision(obj1, obj2);
  }
}

可以如下改进代码,去掉笛卡尔积的"lower half"(前提是碰撞关系是对称的),用for循环代替foreach循环。

for ( int i = 0; i < objectList.Count(); i++ )
{
    var iObj = objectList[i];
    for ( int j = i ; j < objectList.Count(); j++ )
    {
        var jObj = objectList[j];
        if ( iObj.collideWith(jObj) )
        {
            Collision( iObj, jObj );
        }
    }
}

这将 rof 碰撞检查的次数大致减少了 2 倍。但是,运行时的复杂度是相同的,而且该方法很难用 Linq 实现。