2010-05-19 2 views
8

Почему код ниже не очищает все данные списка массивов?Очистить все данные списка массивов

 Console.WriteLine("Before cleaning:" + Convert.ToString(ID.Count)); 
     //ID.Count = 20 
     for (int i = 0; i < ID.Count; i++) 
     { 
      ID.RemoveAt(i); 
     } 
     Console.WriteLine("After cleaning:" + Convert.ToString(ID.Count)); 
     //ID.Count = 10 

Почему 10 напечатано на экране?

Возможно, есть еще одна специальная функция, которая удаляет все?

+0

В первый раз через цикл вы удаляете элемент в позиции 0.В списке теперь 19 элементов, позиция в позиции 1 теперь перемещается в нулевое положение, 2 -> 1, 3-> 2 и т. Д. Во второй раз через цикл вы удаляете элемент в позиции 1 (это раньше было пунктом 2). Вы пропустили элемент в позиции 0 (это был элемент 1). Таким образом вы удаляете каждый второй элемент из списка. –

ответ

6
`Array.Clear()` 

удаляет все элементы в массиве.

`Array.RemoveAt(i)` 

удаляет элемент i-го индекса в массиве.

2

Используйте ясно() Метод

или

изменение ID.RemoveAt(i); к ID.RemoveAt(0);

Всякий раз, когда элемент удаляется из коллекции, его индекс тоже меняется. Следовательно, когда вы говорите ID.RemoveAt(0);, элемент в индексе 1 теперь будет перемещен в индекс 0. Таким образом, вы снова должны удалить один и тот же элемент (например, dequeuing). пока не достигнете последнего элемента. Однако, если вы хотите удалить все элементы сразу, вы можете лучше использовать метод Clear().

2

После удаления 10 предметов, ID.Count() == 10 и i == 10, так что петля останавливается.

Используйте ID.Clear(), чтобы удалить все элементы в списке массивов.

11

Вы на самом деле звоните RemoveAt 10 раз. Когда i достигнет 10, ID.Count будет равно 10. Вы могли это исправить, выполнив:

int count = ID.Count; 
for (int i = 0; i < originalCount; i++) 
{ 
    ID.RemoveAt(0); 
} 

Это O операции (п), хотя, как удаление записи из начала списка включает в себя копирование и все остальное.

Более эффективно (O (п)):

int count = ID.Count; 
for (int i = 0; i < originalCount; i++) 
{ 
    ID.RemoveAt(ID.Count - 1); 
} 

или эквивалент, но проще:

while (ID.Count > 0) 
{ 
    ID.RemoveAt(ID.Count - 1); 
} 

Но использование ID.Clear(), вероятно, более эффективным, чем все они, несмотря на то, что это также O (п).

1

Ваш код делает:

ID.RemoveAt(0); 
... 
ID.RemoveAt(9); 
ID.RemoveAt(10); \\ at this point you have already removed 10 
       \\ items so there is nothing left on 10- 19, but you are left with 
       \\ the 'first' 10 elements 
... 
ID.RemoveAt(19); 

Вообще говоря, ваш метод удаляет каждый второй элемент из списка ..

Использование ArrayList.Clear вместо этого как другие упоминали.

Смежные вопросы