2013-04-10 4 views
0

이 코드를 더 효율적으로 만들 수있는 방법이 있습니까? 이것은 내가 무슨 짓을다른 목록에 색인이 포함되어 있지 않은 경우 목록에서 제거

if (includeRows != null && includeRows.Count > 0) 
{ 
    for (int i = aList.Count - 1; i >= 0; i--) 
    { 
     if (!includeRows.Exists(j => j == (i + 1))) 
     { 
      aList.RemoveAt(i); 
      includeRows.Remove(i + 1); 
     } 
    } 
} 

의 aList는 includeRows.Remove은()가 작거나보다 효율적으로 할 경우 객체가 정수, 그래서 list.Not에서 확인 객체의 인덱스를 필요로하지 포함, includeRows이었다 방금 HashSet으로 변경되었습니다.

for (int i = aList.Count - 1; i >= 0; i--) { 
        if (!includeRows.Contains(i + 1)) 
        { 
         aList.RemoveAt(i); 
         // includeRows.Remove(i + 1); 
        } 
} 
+0

당신이 인덱스의 목록을 가지고 있고 다른 목록에서 제거 할 인덱스에 포함되지 않은 항목 :

리스트 성능 대 HashSet의에 대한 토론이 보여? – Nahum

+0

예 ----------- – tsukimi

답변

3

건물을 사용할 수 있습니다, 나는 할 것이다 :

HashSet<int> includeRowsFaster = new HashSet<int>(includeRows); 
aList.RemoveAll(i => !includeRowsFaster.Contains(i + 1)); 
가장 효율적인 성능과 읽기 쉽도록

. includeRows에서 요소를 찾는 것은 O (n) 복잡도 연산입니다. 벡터 (배열 또는 목록) 구현 대신 해시 집합을 사용하여 O (log (n))로 크게 줄일 수 있습니다. 그래서 https://stackoverflow.com/a/10762995/390330

+0

+1 예, 더 효율적이고 읽기 쉽습니다. –

+0

여기에있는 해시 세트가 추가 성능을 얻습니다. – tsukimi

3

여기 Linq에의 Intersect 방법 쉬운 방법 :

aList = aList.Intersect(includeRows).ToList(); 

그러나 성능 향상을 위해 당신이 pswg의 대답에 RemoveAll 대신

aList.RemoveAll(i => !includeRows.Exists(j => j == (i + 1)); 
+0

+1 읽을 수있는 솔루션 – basarat

+0

고맙습니다. 인터 섹트 (Intersect)는 좋은 생각이지만, 생각하지는 않았지만 RemoveAll을 고수 할 것입니다. – tsukimi

0
aList = aList.Intersect(includeRows).ToList<int>();