ArXen42
@ArXen42

Как удалить элемент списка в цикле (C#)?

Есть некий список. Задача - идти по нему циклом, сравнивать (определенной логикой) значения текущего и соседних элементов и, на основании этих данных, удалять из них один или несколько элементов.
C первым более менее понятно, LinkedList умеет получать соседние элементы. Проблема со вторым - как удалять в цикле? Можно было бы делать это с двумя списками и складывать оставшиеся после удаления в отдельный список, но ведь есть еще и сравнения - для них такое не прокатит.
  • Вопрос задан
  • 13179 просмотров
Решения вопроса 1
Neuroware
@Neuroware
Программист в свободное от работы время
В принципе в чем затык мне понятно, при изменении коллекции все нормальные foreach или тп. отваливаются, тут либо while либо for с "фичей", к примеру можно так (пример удаление всех нечетных элементов списка):
Random rnd = new Random();
            var s = new List<int>();
            for (int i = 0; i < 20; i++)
            {
                s.Add(rnd.Next(10));
            }
            for (int i = 0; i < s.Count ; i++)
            {
                if (s[i]%2==0)
                {
                    s.RemoveAt(i);
                    i--; //фишка в том чтобы сдвинуть i на единицу назад, т.к. после удаления следующий элемент будет на том же индексе что и старый (удаленный)
                }
            }
            Console.WriteLine(s);
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Inv3go
В чем именно проблема, просто прочитал пару раз вопрос так и не понял в чем затык?
Что мешает при обходе создавать новый список с элементами которые не должны быть удалены и в конце просто заменять ссылку старого на новый.
Или работать с копией списка в цикле и удалять через .Remove(T) в исходном списке ?
Или формировать новый список из удаленных элементов, а потом делать через Linq Except ?
И кстати удалять из цикла foreach нельзя, для того чтобы модифицировать массив данных с которым работаете в цикле необходимо работать с его итератором, через другие циклы, например while.
Это лишь некоторые из вариантов первыми пришедшие в голову, думаю можно еще с десяток придумать.
Ответ написан
DmitryITWorksMakarov
@DmitryITWorksMakarov
foreach тут в любом случае не подходит

посмотрите вот тут например.....несколько реализаций задачи подходящей под ваше описание (правда не все корректные =)
Ответ написан
@codilmax
рабочий вариант удаления элемента списка в цикле
foreach (var link in links.tolist)
if (условие) links.remove(link);
Примечание: к списку links доблено ключевое слова "tolist". Без него будет ошибка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы