2017-03-20 5 views
2

주어진 코드를 개선하도록 요청 받았습니다. 코드의 개념은 객체의 목록을 가져 오는 것이며 두 개의 foreach 루프가 충돌하는지 확인합니다. 의사로 작성된 코드 : - 효율적이지 못하다 각 개체에 대해목록 C에서 후속 요소 가져 오기 #

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

는 각 개체 위에 반복합니다. 대신 "각 개체에 대해 모든 후속 개체에 반복"으로 변경해야합니다. C#을 상당히 새로운 임, 그러나 이것은 내가 의사의 soulution imagened하는 방법입니다 : 객체가 한 번 서로 충돌하는 경우

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

이 방법은, 난 단지 확인 해요입니다. 하지만 내 목록에 "후속 객체"를 얻으려면 어떻게해야합니까?

+3

"C# linq intersect"를 검색하는 것이 좋습니다. – granadaCoder

+0

필자는 필자가 어떻게 유용 할 지 확신하지 못합니다. 교차하지 않는다면 두 개의리스트를 가져와 같은 원소를 반환 할 것인가? 나는 오직 하나의 대상 목록 만 갖고있다. – Hako

+1

http://stackoverflow.com/questions/18547354/c-sharp-linq-find-duplicates-in-list – granadaCoder

답변

3
당신은 다음과 같이 (충돌 관계가 대칭 것이어야한다) 데카르트 제품의 "아래쪽"를 제거하여 코드를 향상시킬 수

, foreach 루프 대신 for 루프를 사용하십시오.

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); 
     } 
    } 
} 

이 약 2 배의 충돌 검사 ROF 한 접점을 감소

그러나, 런타임 복잡성은 동일하고, 접근로 Linq를 구현하기 어렵다.

+0

두 번째 루프에서 j = i를 초기화하므로 두 번째 루프를 통과 할 때마다 각 개체 자체에 대한 불필요한 비교 –

+0

우수! 이것은 나를 위해 일했다 -하지만 다음 라인을 추가 : if (! iObj.Equals (jObj) &&! jObj.Equals (_player))이 방법은 객체 자체와 비교하지 않는다. 내 질문의). 감사! – Hako

+0

@JoeIrby 네, 사실이 비교는 원래의 질문에서도 이루어지기 때문에 나는 현명하게 이것을했습니다. – Codor

2

"각 객체의 경우, 이후의 모든 객체를 통해 루프"

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); 
    } 
}