Как работает RemoveAt в List?

Рейтинг: 1Ответов: 1Опубликовано: 26.02.2015

Например, у нас есть лист с пятью элементами (индексы: 0 1 2 3 4). Если мы удалим элемент с индексом 3, четвертый элемент получит индекс 3 и длина листа уменьшится? Также интересует само удаление элемента: компилятор освобождает память, которую удаленный элемент занимал, и как быстро? То есть, например, если пользователь пользуется программой несколько часов и из листа за это время было удалено уже тысячи элементов, не будет ли никаких проблем с памятью?

Ответы

▲ 1Принят

Раз уж вам лень написать код самому и запустить, то можете воспользоваться этим:

var lst = new List<int> { 5, 6, 7, 8, 9 };

for(int i = 0; i < lst.Count; i++)
    Console.WriteLine("lst[{0}] = {1}", i, lst[i]);

Console.WriteLine();
lst.RemoveAt(3);

for (int i = 0; i < lst.Count; i++)
   Console.WriteLine("lst[{0}] = {1}", i, lst[i]);

Распределение элементов и индексов после удаления вполне прозрачно.

Относительно проблем с памятью. Нет, проблем не будет, сборщик мусора работает вполне надежно. Теоретически проблемы возможны, если ваш класс, экземпляры которого содержатся в List, содержит какие-то ресурсы, подлежащие освобождению, и вы перед RemoveAt забыли вызвать Dispose и/или вовсе неверно его реализовали. Но это довольно специфичный случай