Foreach循环没有完成,因为正在对收集进行修改

本文关键字:修改 因为 循环 Foreach | 更新日期: 2023-09-27 18:15:35

我有一个包含视图模型对象的可观察对象集合。我正试着仔细检查这些东西,把任何有植物的地方移走。有生命的财产是"不"。我正在使用这个代码:

        foreach (PlantViewModel plant in Plants)
        {
            if (plant.Living == "No") 
            {
            Plants.Remove(plant);  
            }
        }
        PlantsViewSource.Source = Plants;
        PlantsGridView.SelectedItem = null;

但是,当遇到第一个满足条件的对象并删除该对象时,它会修改集合,并且foreach抛出错误。如何以另一种方式从集合中删除对象?

Foreach循环没有完成,因为正在对收集进行修改

错误告诉您,无法从枚举的集合中删除项。一个答案是保留一个你想要删除的项目的列表。

List<PlantViewModel> plantsToRemove = new List<PlantViewModel>();
foreach (PlantViewModel plant in Plants)
        {
            if (plant.Living == "No") 
            {
            plantsToRemove.Add(plant);  
            }
        }
         foreach(var plant in plantsToRemove)
             Plants.Remove(plant);
        PlantsViewSource.Source = Plants;
        PlantsGridView.SelectedItem = null;

一个更可读的选项是;

List<PlantViewModel> plantsToRemove = Plants.Where(p => p.Living == "No");
foreach(var plant in plantsToRemove)
                 Plants.Remove(plant);
            PlantsViewSource.Source = Plants;
            PlantsGridView.SelectedItem = null;