C# 获取列表C中的后续元素#
我被要求改进一段给定的代码。代码的思想是获取对象列表,并使用两个foreach循环检查它们是否冲突。用伪代码编写的代码:C# 获取列表C中的后续元素#,c#,list,collision-detection,C#,List,Collision Detection,我被要求改进一段给定的代码。代码的思想是获取对象列表,并使用两个foreach循环检查它们是否冲突。用伪代码编写的代码: foreach (Entity object in objectList) foreach (Entity object2 in objectList) if (object.collideWith(object2)) Collision(object,object2) foreach (Entity object in o
foreach (Entity object in objectList)
foreach (Entity object2 in objectList)
if (object.collideWith(object2))
Collision(object,object2)
foreach (Entity object in objectList)
if (object.collideWith(subsequent object))
Collision(object, subsequent object)
对于每个对象,它在每个对象上循环-这是无效的。相反,我应该将它改为“对于每个对象,循环每个后续对象”。我对C#相当陌生,但这是我如何用pseudo来想象溶液的:
foreach (Entity object in objectList)
foreach (Entity object2 in objectList)
if (object.collideWith(object2))
Collision(object,object2)
foreach (Entity object in objectList)
if (object.collideWith(subsequent object))
Collision(object, subsequent object)
这样,我只检查一个对象是否与另一个对象碰撞一次。但是如何在列表中获取“后续对象” “对于每个对象,在每个后续对象上循环”
for(int i=0;i
您可以通过消除笛卡尔积的“下半部分”(假设碰撞关系是对称的)来改进代码,如下所示,使用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 );
}
}
}
for(int i=0;i
这将碰撞检查的数量大约减少了2倍。但是,运行时的复杂性是相同的,并且这种方法很难用Linq实现。我建议搜索“c#Linq intersect”,我不太确定它在我的情况下会有什么用处。不相交获取两个列表并返回相同的元素?我只有一个对象列表。您正在第二个循环中初始化j=I,因此每次通过第二个循环时,都会对每个对象与其自身进行不必要的比较!这对我来说很有效-但是我添加了以下一行:如果(!iObj.Equals(jObj)&!jObj.Equals(_player))这样对象就不会与自身进行比较(这不是你的错,因为它不是我问题的一部分)。谢谢@JoeIrby是的,但我做得很简洁,因为在原始问题中也会进行比较。您可能最好使用
Count
属性,而不是Count()
扩展方法。