2012-12-03 3 views
-1

나는이 같은 POCO 있습니다비교기를 사용하여 목록에서 항목을 삭제할 수 있습니까?

class Poco{ 
    int first; 
    int last; 
    int category; 
} 

List<Poco> pocoList; 

나는 그들이 특정 카테고리와 항목과 중복 목록에서 항목을 제거해야 할 목록을 다음과 같이 정의되고 오버랩 :

if (a.category!=category && (a.first >= b.first && a.first <= b.last) || (a.last >= b.first && a.last <= b.last)){ 
    // delete item a 
} 

두 개의 중복 항목에는 동일한 카테고리가 없습니다. 마지막은 항상 처음보다 큽니다. 처음과 마지막은 범위를 정의합니다. 두 개 이상의 중복이있을 수 있습니다.

List [n] .start < List [n + 1] .start가 항상 true가되도록 목록이 정렬됩니다.

예를 들어 카테고리가 10 인 경우 카테고리가 10이고 항목의 범위 중 일부가 카테고리 10의 항목 범위와 겹치는 모든 항목을 삭제해야합니다.

내 현재 구현은 매우 어렵고 내 응용 프로그램을 프로파일 링 할 때 사용되는 처리 분기 전체 시간의 65 %가이 루프에서 소비된다는 것을 알 수 있습니다.

for (int i=object.pojoList.Count-1;i>=0;i--){ 
    for (int j=object.pocoList.Count-1;j>=0;j--){ 
     if (pocoList[i].overlaps(pocoList[j],category){ 
      pocoList.RemoveAt(j); 
     }    
    } 
} 

비교기 또는 LINQ를 사용하여 항목을 삭제하는 방법이 있어야한다고 생각하지만 해결할 수 없습니다.

제안 사항? 고맙습니다.

+0

코드에 오타가 있습니까? 'a.first> = b.first || a.first <= b.last'는'b.first <= b.last' 인 경우 true가됩니다. 이는 실질적으로 항상 의미합니다. – Jon

+0

또한 'i> = 0'과'j> = 0'이 아닌가? 또한 'overlaps' 관계가 대칭 적이기를 원하는가? ('a overlaps b는 반드시'b overlaps a '를 의미하지는 않습니다.) – Rawling

+0

@Jon 예, 오타가 수정되었습니다. a의 일부가 b의 일부와 겹치는 경우 여야합니다. – Simon

답변

1

, 당신은

List<Poco> potentialOverlaps = new List<Poco>(); 
for (int i = 0; i < pocoList.Count; i++) 
{ 
    var currentPoco = pocoList[i]; 

    // Clear out overlaps that end before this poco starts. 
    potentialOverlaps.RemoveAll(p => p.last < currentPoco.first); 

    if (currentPoco.category == category) 
    { 
     potentialOverlaps.Add(currentPoco); 
    } 
    else if (potentialOverlapsCount > 0) 
    { 
     pocoList.RemoveAt(i); 
     i--; 
    } 
} 

결과는 코드가 제공 내용과 다를 수 있습니다 뭔가를 시도 할 수있다, 그러나 당신의 설명 동작을 일치해야합니다.

"아직 끝나지 않았습니다"선택한 카테고리에서 Poco을 추적합니다. 카테고리가 아닌 Poco에 해당하고 "아직 끝나지 않았습니다"라는 항목이 있으면 그 중 하나와 겹쳐져 있어야 제거 할 수 있습니다.

+0

테스트되고 작동하며 두 배 이상 빠릅니다. 고맙습니다! – Simon

0

클래스를 IComparer로 구현할 수 있습니다.

여러분은 Compare (Object, Object) 메서드를 1, 0 또는 -1을 반환하는 방식으로 각각 같거나 더 작게 구현해야합니다. 좋은 examaple에 대한

출처 : link

당신은 하나의 목록에서 다른 구분 기호를 설정할 수 있습니다. 그런 다음 위의 방법을 사용하여 정렬 할 때 값이 구분 기호의 범위와 겹치면 대신 값을 제거합니다. 귀하의 의견 목록이 start하기 때문에

관련 문제