목록을 반복하는 동안 목록에서 Remove
또는 RemoveAt
목록을 사용 하는 것은 의도적으로 어려워졌습니다. 왜냐하면 거의 항상 잘못된 일 이기 때문입니다 . 영리한 트릭으로 작동시킬 수는 있지만 매우 느릴 것입니다. 전화를 걸 때마다 Remove
전체 목록을 스캔하여 제거하려는 요소를 찾아야합니다. 전화를 걸 때마다 RemoveAt
후속 요소를 1 위치 왼쪽으로 이동해야합니다. 이와 같이, 어떠한 용액을 사용 Remove
하거나 RemoveAt
, 차 시간을 필요로 할 O (n²) .
가능하면 사용하십시오 RemoveAll
. 그렇지 않으면 다음 패턴 은 목록 을 선형 시간 O (n) 에서 제자리 로 필터링합니다 .
// Create a list to be filtered
IList<int> elements = new List<int>(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
// Filter the list
int kept = 0;
for (int i = 0; i < elements.Count; i++) {
// Test whether this is an element that we want to keep.
if (elements[i] % 3 > 0) {
// Add it to the list of kept elements.
elements[kept] = elements[i];
kept++;
}
}
// Unfortunately IList has no Resize method. So instead we
// remove the last element of the list until: elements.Count == kept.
while (kept < elements.Count) elements.RemoveAt(elements.Count-1);