Набор был изменен; перечисление не может выполнить ошибку при удалении ListItem из LIstBox

У вас есть

io.zipkin.reporter2:zipkin-reporter:jar:2.2.0:compile (version managed from 2.7.14)

Это означает, что в вашем POM или Parent POM есть запись <dependencyManagement>, которая устанавливает версию на 2.2.0.

8
задан Chris Schiffhauer 7 February 2014 в 18:40
поделиться

5 ответов

Невозможно изменить коллекцию, пока вы перечисляете ее в .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 . Очень важно, чтобы в строке содержался вызов .ToList (), потому что это заставляет запрос выполняться немедленно, а не с задержкой выполнения.

Следующие две строки перебирают каждое выбранное значение и удаляют или добавляют его в соответствующий список. Поскольку выбранный список уже сохранен, мы больше не перечисляем коллекцию при ее изменении.

17
ответ дан 5 December 2019 в 05:27
поделиться

Вы не можете изменить коллекцию, пока используете Enumerator для этой коллекции, что делает для каждого оператора.

Вы должны зацикливать данные с помощью цикла for, а затем вы Можно изменить коллекцию, но вы должны быть осторожны, чтобы правильно обновить текущий индекс, если вы вставляете или удаляете элементы. Если вы просто добавляете или удаляете элементы и не вставляете их, то итерация от последнего элемента к первому подойдет.

protected void btnAdd_Click(object sender, EventArgs e)
{
    for (Int32 i = lstAvailableColors.Items.Count; i >= 0; i--)
    {
        ListItem item = lstAvailableColors.Items[i];

        if (item.Selected)
        {
            lstSelectedColors.Items.Add(item);
            lstAvailableColors.Items.Remove(item);
        }
    }
}
6
ответ дан 5 December 2019 в 05:27
поделиться

Как уже упоминалось в другом ответе, вы не можете удалять элементы, пока не завершите итерацию. Поэтому, возможно, что-то подобное будет для вас наиболее чистым:

var itemsToRemove =
lstAvailableColors.Items.Cast<ListItem>().Where(i => i.IsSelected).ToArray();

foreach(ListItem item in itemsToRemove) lstAvailableColors.Remove(item);
3
ответ дан 5 December 2019 в 05:27
поделиться

Вы не можете изменять коллекцию, для которой вы выполняете итерацию. В общем, хорошим решением для этого типа проблемы является создание пустой коллекции, и в вашем итераторе скопируйте все элементы, которые вы НЕ хотите удалять; после завершения итерации замените исходную коллекцию новой.

4
ответ дан 5 December 2019 в 05:27
поделиться

Вы не можете изменять коллекцию, пока выполняете ее. Или переберите копию или используйте для, переберите в обратном порядке и удалите, когда вы спуститесь.

1
ответ дан 5 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

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