我被要求改进给定的一段代码。代码的想法是获取对象列表,并通过两个foreach循环检查它们是否冲突。用伪代码编写的代码:
foreach (Entity object in objectList)
foreach (Entity object2 in objectList)
if (object.collideWith(object2))
Collision(object,object2)
对于每个对象,它在每个对象上循环-效率不高。相反,我应该将其更改为“对于每个对象,遍历每个后续对象”。我对C#来说还很陌生,但这是我用伪图片描述解决方案的方式:
foreach (Entity object in objectList)
if (object.collideWith(subsequent object))
Collision(object, subsequent object)
这样,我只检查一个对象是否与另一个对象碰撞一次。但是,如何在列表中获取“后续对象”?
最佳答案
您可以使用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 );
}
}
}
这样可以将numbe rof冲突检查大约减少2倍。但是,运行时复杂度是相同的,并且该方法很难用Linq实现。
关于c# - 获取列表C#中的后续元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42905015/