- 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);
}
}
Классика
kegdan 09.08.2013 16:06 # 0
А то получился совсем говнокод говнокода)
guest 09.08.2013 16:56 # 0
guest 09.08.2013 16:57 # +2
{
Collection.Remove(i);
}
Lokich 09.08.2013 18:08 # 0
http://msdn.microsoft.com/ru-ru/library/ms132413.aspx
Lokich 09.08.2013 18:06 # +1
orion 09.08.2013 18:21 # 0
kegdan 09.08.2013 18:36 # +1
Вообще правильное удаление будет выглядеть так
Collection.RemoveAll((collectionElement) => collectionElement == x);
Главная загвоздка говнокода - он не удалит все вхождения Х.
vistefan 09.08.2013 19:06 # 0
kegdan 09.08.2013 19:11 # +1
вот пример входной коллекции
1,...,1(примерно 10000 элементов)2,2,2,2,2.
Начинаешь ты удалять все вхождения двойки.
Он найдет первую и начнет искать сначала.
сколько раз он пройдет по всем единицам?
расово верный цикл для удаления
anonimb84a2f6fd141 09.08.2013 19:10 # 0
И главное: worst case O(n^2). Не проще ли копию создать одним выражением linq?
kegdan 09.08.2013 19:39 # 0
anonimb84a2f6fd141 09.08.2013 21:37 # 0
kegdan 09.08.2013 22:16 # 0
anonimb84a2f6fd141 10.08.2013 00:14 # 0
kegdan 10.08.2013 00:36 # 0
Но с RemoveAll красивее
anonimb84a2f6fd141 10.08.2013 00:45 # 0
kegdan 10.08.2013 02:12 # 0
Пруф
http://msdn.microsoft.com/ru-ru/library/wdka673a.aspx
anonimb84a2f6fd141 10.08.2013 18:57 # +1
superhackkiller1997 10.08.2013 19:06 # −1
anonimb84a2f6fd141 11.08.2013 03:17 # +2
Читать умеешь?
superhackkiller1997 11.08.2013 10:46 # −3
И да, питушок, на уровне ВМ выделение памяти ничего не стоит, а в нормальном коде они бесплатны. Ты не путай уровень говно, на котором ты, говно, пишешь говно и уровень ВМ.
kegdan 11.08.2013 11:07 # +1
superhackkiller1997 11.08.2013 11:16 # −2
Да не нужно это, зачем мне что-то делать через жопу - когда я беру сишку и юзаю сисколы? С памятью и в паскале типа можно работать, но это "эмуляция", жалкая эмуляций, а не работа с памятью, но т.к. никто из вас матчасти не знает - для вас это "работа напрямую".
booratihno 04.04.2021 20:53 # 0
Что мешает делать это на том же паскале -- не понятно.
Также не понятно зачем тут сисколы (это про brk чтоль?), не говоря уже о том, что сисколы не переносимы
anonimb84a2f6fd141 11.08.2013 15:38 # −1
Действительно, неинтресно. Хочешь сишкоблядствовать? Пиздуй на си.
superhackkiller1997 11.08.2013 20:29 # −3
anonimb84a2f6fd141 11.08.2013 20:55 # 0
Дада, иди на работу - байтики двигать. Раз-раз-раз.
kegdan 11.08.2013 21:19 # 0
superhackkiller1997 11.08.2013 23:16 # −2
superhackkiller1997 11.08.2013 23:16 # −2
anonimb84a2f6fd141 11.08.2013 23:19 # 0
В твоих влажных мечтах, Манька.
superhackkiller1997 12.08.2013 00:17 # −3
anonimb84a2f6fd141 12.08.2013 01:11 # −1
Это не выделение, пидорва?
superhackkiller1997 12.08.2013 01:16 # −3
anonimb84a2f6fd141 12.08.2013 02:30 # −1
superhackkiller1997 12.08.2013 09:37 # −2
1, 2, 3, 2, 4, 1, 3, 1 - твоя байда, тебе надо выпилить все еденицы - пудумай своей одно извилиной - как это сделать за O(n).
bormand 12.08.2013 09:58 # +1
Элементарно ;) Но писать решение не буду, вопрос все таки не ко мне был...
roman-kashitsyn 12.08.2013 10:10 # +1
Вчера kegdan уже привёл вариант решения Правда, для плюсов в общем случае нужен код похитрее.
superhackkiller1997 12.08.2013 10:20 # −1
roman-kashitsyn 12.08.2013 11:47 # 0
Царь, исправьте анскильный недокод на православной няшке своей всемогущей дланью.
Belorus 22.08.2013 20:43 # −2
Тут без оленей вроде тебя все знают как за O(n) по времени и памяти отфильтровать список. Иди лови сегфолты и мемори корапты, чмо.
bormand 31.08.2013 22:48 # +2
Спокойствие, только спокойствие... от чего у вас случился такой огненный баттхерт?
3.14159265 01.09.2013 16:53 # +3
guest8 05.04.2019 01:51 # −999
PACTPOBblu_nemyx 05.04.2019 01:52 # 0
anonimb84a2f6fd141 01.09.2013 00:26 # 0
booratihno 04.04.2021 20:38 # +1
На такое следует отвечать "иди лови стопзеворлдные GC, хранение четырёх байт в куче, и ручное управление ресурсами"
OCETuHCKuu_nemyx 05.04.2019 01:47 # 0
MATEMATuK_u3_PAIIIKu 03.04.2021 11:00 # 0
MATEMATuK_u3_PAIIIKu 03.04.2021 11:02 # +1
guest6 04.03.2023 20:35 # 0
kedgan 04.03.2023 23:18 # 0
kegdan 12.08.2013 12:27 # 0
roman-kashitsyn 12.08.2013 12:33 # 0
почти нормально, но царь не приемлит нецарских языков, а хочется увидеть его вариант.
3.14159265 01.02.2022 01:23 # 0
Ты забыл сказал «пужулуйста».
HoBorogHuu_nemyx 01.02.2022 09:53 # 0
OCETuHCKuu_nemyx 05.04.2019 01:57 # 0
OCETuHCKuu_nemyx 05.04.2019 01:48 # 0
roman-kashitsyn 10.08.2013 19:47 # 0
kegdan 10.08.2013 21:05 # 0
честно говоря я не думаю, что там банальный цикл.
Фиг его знает. На мсдн что у remove, что у removeAll стоит o(n). Думаю они бы написали что то вроде "Данный метод юзает обычный remove, почему o(n*n), будь внимателен, анонимус".
Хотя - эо же мсдн, там ничему верить нельзя)
guest 10.08.2013 22:00 # 0
Чтобы в этом убедиться создайте большой массив заполненный одним и тем же числом. Например, на 1е6 элементов. Удаляет мгновенно, явно не за квадрат.
roman-kashitsyn 10.08.2013 22:34 # 0
kegdan 11.08.2013 02:08 # 0
>Да линейный алгоритм removeAll() вообще несложно реализовать даже для ArrayList.
Просто переписывать элементы по ходу. После каждого подходящего для удаления смещение увеличивается. а потом удаляются из конца N элементов.
Ну это я на вскидку решение предложил.
kegdan 11.08.2013 02:30 # 0
Как-то так
kegdan 11.08.2013 02:03 # 0
vistefan 09.08.2013 22:09 # +1
Grammar-nazi к вашим услугам.
kegdan 10.08.2013 00:42 # −1
anonimb84a2f6fd141 10.08.2013 00:46 # 0
1024-- 10.08.2013 11:12 # 0
guest 09.08.2013 22:28 # +4
guest 10.08.2013 21:13 # −6
3.14159265 12.08.2013 15:50 # 0
guest 10.08.2013 21:24 # −1
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.
Т.е. мы последнюю пятерку не удалили. Как так?
guest 10.08.2013 21:32 # 0
kegdan 11.08.2013 02:01 # +1
http://ideone.com/lLNdLI
anonimb84a2f6fd141 11.08.2013 03:21 # 0
Вроде как с foreach бы исключение вылетело при модификации колекции?
kegdan 11.08.2013 04:24 # 0
Qwertiy 31.08.2013 22:17 # 0
kegdan 31.08.2013 22:46 # 0
anonimb84a2f6fd141 01.09.2013 00:27 # 0
cyperh 02.03.2014 19:32 # 0
for (var i = 0; i < Collection.Count; i++)
{
Collection.Remove(1);
}
разве этого не достаточно? remove(x) на каждой итерации будет удалять первое вхождение которое равно x, в данном случае x = 1
cyperh 02.03.2014 19:34 # 0
guest 02.03.2014 19:49 # 0
OCETuHCKuu_nemyx 05.04.2019 01:49 # 0