Вы не можете удалить элемент из списка, используя ForEach l oop. В этом случае вы должны использовать для l oop.
var list = new List<string>();
list.Add("a");
list.Add("b");
list.Add("c");
list.Add("d");
for(int i = 0; i < list.Count(); i++)
{
if(list[i].Contains("a"))
{
list.RemoveAt(i);
}
}
Ваш список результатов будет:
b
c
d
Оставив выше для справки, но к @LarsTech комментарий ниже, list.RemoveAt ломает l oop, поэтому он удалит только 1 элемент. Если вы хотите удалить несколько элементов, другой ответ Алекса с Linq будет самым чистым способом удалить его.
Если вы не хотите создавать второй список для размещения элементов, подлежащих удалению, вы также можете сделать следующее:
for (int i = 0; i < list.Count(); i++)
{
if (list[i].Contains("a"))
{
list = list.Where(x => !x.Contains("a")).ToList();
}
}