@GK566

Как правильно удалить элемент из коллекции в C# 6?

Добрый день.

Пожалуйста, подскажите, как правильно удалять элемент из коллекции.

Дано:
Values = new ObservableCollection<RT>();
Где RT реализовывает INotifyPropertyChanged.

Коллекция байндидся в DataGrid.

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

using (var sequenceEnum = except.GetEnumerator())
{
    while (sequenceEnum.MoveNext())
    {
        string item = sequenceEnum.Current.ToString();

        Values.Remove(Values.Single(RT => RT.Name == item));
    }
}


Но в таком случае возникает ошибка:
Exception thrown: 'System.InvalidOperationException' in mscorlib.dll
Коллекция была изменена; невозможно выполнить операцию перечисления.


Подскажите, что я делаю не так.
  • Вопрос задан
  • 3117 просмотров
Решения вопроса 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
Во время обхода коллекции в цикле c помощью "GetEnumerator()" и "MoveNext()" нельзя менять состав этой коллекции.
Чтобы обойти такое ограничение, создаем копию исходной коллекции (например, методом "ToArray()") и делаем обход этой копии:
foreach(var item in except.ToArray()) {
    Values.Remove(item);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kttotto
пофиг на чем писать
Проходите по коллекции с конца через for, доступ к элементам через индексатор. На коленке, просто чтоб смысл был понятен, что-то типа этого
for(var i = arr.Count - 1; i >= 0; i--)
{
     if(arr[i].Name == "Any")
     {
         arr.RemoveAt(i);
     }
}

Ну и на всякий случай, у linq есть метод RemoveAll
arr.RemoveAll(x => x.Name == "Any");
А еще можно вернуть новую коллекцию, где не будет этого значения
arr.Where(x => x.Name != "Any");
По смыслу это будет тоже самое. Но в первом варианте, для удаления, Вам не придется создавать копии коллекций, ибо варианты с linq вернут новые списки. Особенно это актуально когда нужно избежать лишние алокации, если Ваш список внушителен по объему.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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