由于正在进行的集合修改,Foreach循环不会完成

时间:2014-07-30 16:58:22

标签: c# foreach observablecollection

这对于你们其中一个聪明的人来说很简单 - 我有一个包含viewmodel对象的可观察集合。我试图通过这些物品并移除任何植物.Living属性是" No"。我正在使用此代码:

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

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

1 个答案:

答案 0 :(得分:2)

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

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;