Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取列表C中的后续元素#_C#_List_Collision Detection - Fatal编程技术网

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

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循环检查它们是否冲突。用伪代码编写的代码:

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()
扩展方法。