获取列表 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 实现。
有人要求我改进给定的一段代码。该代码的想法是获取一个对象列表,并使用两个 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 实现。