Невозможно изменить коллекцию, пока вы перечисляете ее в .Net. Вы должны разделить свое перечисление и удалить код в разные блоки. Вот краткий пример того, как это сделать без LINQ
protected void btnAdd_Click(object sender, EventArgs e)
{
var selected = new List<ListItem>();
foreach (ListItem item in lstAvailableColors.Items)
{
if (item.Selected)
{
selected.Add(item);
lstSelectedColors.Items.Add(item);
}
}
foreach (ListItem item in selected)
{
lstAvailableColors.Items.Remove(item);
}
}
А вот более краткая версия с использованием LINQ
var selected = lstAvailableColors.Cast<ListItem>().Where(i => i.Selected).ToList();
selected.ForEach( x => { lstSelectedColors.Items.Add(x); });
selected.ForEach( x => { lstAvailableColors.Items.Remove(x);});
EDIT
Версия LINQ работает в двух частях. Первая часть - это первая строка, которая находит выбранные в данный момент элементы и сохраняет значение в List<ListItem>
. Очень важно, чтобы в строке содержался вызов .ToList (), потому что это заставляет запрос выполняться немедленно, а не с задержкой выполнения.
Следующие две строки перебирают каждое выбранное значение и удаляют или добавляют его в соответствующий список. Поскольку выбранный список уже сохранен, мы больше не перечисляем коллекцию при ее изменении.