- 1
- 2
- 3
- 4
- 5
- 6
- 7
for (var i = 0; i < Collection.Count(); i++)
{
if (i==x)
{
Collection.Remove(i);
}
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+124
for (var i = 0; i < Collection.Count(); i++)
{
if (i==x)
{
Collection.Remove(i);
}
}
Классика
А то получился совсем говнокод говнокода)
{
Collection.Remove(i);
}
http://msdn.microsoft.com/ru-ru/library/ms132413.aspx
Вообще правильное удаление будет выглядеть так
Collection.RemoveAll((collectionElement) => collectionElement == x);
Главная загвоздка говнокода - он не удалит все вхождения Х.
вот пример входной коллекции
1,...,1(примерно 10000 элементов)2,2,2,2,2.
Начинаешь ты удалять все вхождения двойки.
Он найдет первую и начнет искать сначала.
сколько раз он пройдет по всем единицам?
расово верный цикл для удаления
И главное: worst case O(n^2). Не проще ли копию создать одним выражением linq?
Но с RemoveAll красивее
Пруф
http://msdn.microsoft.com/ru-ru/library/wdka673a.aspx
Читать умеешь?
И да, питушок, на уровне ВМ выделение памяти ничего не стоит, а в нормальном коде они бесплатны. Ты не путай уровень говно, на котором ты, говно, пишешь говно и уровень ВМ.
Да не нужно это, зачем мне что-то делать через жопу - когда я беру сишку и юзаю сисколы? С памятью и в паскале типа можно работать, но это "эмуляция", жалкая эмуляций, а не работа с памятью, но т.к. никто из вас матчасти не знает - для вас это "работа напрямую".
Что мешает делать это на том же паскале -- не понятно.
Также не понятно зачем тут сисколы (это про brk чтоль?), не говоря уже о том, что сисколы не переносимы
Действительно, неинтресно. Хочешь сишкоблядствовать? Пиздуй на си.
Дада, иди на работу - байтики двигать. Раз-раз-раз.
В твоих влажных мечтах, Манька.
Это не выделение, пидорва?
1, 2, 3, 2, 4, 1, 3, 1 - твоя байда, тебе надо выпилить все еденицы - пудумай своей одно извилиной - как это сделать за O(n).
Элементарно ;) Но писать решение не буду, вопрос все таки не ко мне был...
Вчера kegdan уже привёл вариант решения Правда, для плюсов в общем случае нужен код похитрее.
Царь, исправьте анскильный недокод на православной няшке своей всемогущей дланью.
Тут без оленей вроде тебя все знают как за O(n) по времени и памяти отфильтровать список. Иди лови сегфолты и мемори корапты, чмо.
Спокойствие, только спокойствие... от чего у вас случился такой огненный баттхерт?
На такое следует отвечать "иди лови стопзеворлдные GC, хранение четырёх байт в куче, и ручное управление ресурсами"
почти нормально, но царь не приемлит нецарских языков, а хочется увидеть его вариант.
Ты забыл сказал «пужулуйста».
честно говоря я не думаю, что там банальный цикл.
Фиг его знает. На мсдн что у remove, что у removeAll стоит o(n). Думаю они бы написали что то вроде "Данный метод юзает обычный remove, почему o(n*n), будь внимателен, анонимус".
Хотя - эо же мсдн, там ничему верить нельзя)
Чтобы в этом убедиться создайте большой массив заполненный одним и тем же числом. Например, на 1е6 элементов. Удаляет мгновенно, явно не за квадрат.
>Да линейный алгоритм removeAll() вообще несложно реализовать даже для ArrayList.
Просто переписывать элементы по ходу. После каждого подходящего для удаления смещение увеличивается. а потом удаляются из конца N элементов.
Ну это я на вскидку решение предложил.
Как-то так
Grammar-nazi к вашим услугам.
List<int> lst = new List<int>();
lst.Add(4); lst.Add(5); lst.Add(5); lst.Add(6); lst.Add(5);
for (int i = 0; i < lst.Count; i++){
if (lst[i] == 5) {
lst.Remove(5);
System.Console.Write(i + " ");
}
}
вывод: 1, 3. Ну да, логично: удаляется пятерка с индексом 1, потом происходит "смещение" списка влево, то есть у второй пятерки индекс стает равным 1;
дальше i == 2, lst[i] == 6 -- ничего не удаляем, i == 3 и удаляется последняя пятерка.
System.Console.WriteLine();
for (int i = 0; i < lst.Count; i++){
System.Console.Write(lst[i] + " ");
вывод: 4 6 5.
Т.е. мы последнюю пятерку не удалили. Как так?
http://ideone.com/lLNdLI
Вроде как с foreach бы исключение вылетело при модификации колекции?
for (var i = 0; i < Collection.Count; i++)
{
Collection.Remove(1);
}
разве этого не достаточно? remove(x) на каждой итерации будет удалять первое вхождение которое равно x, в данном случае x = 1