如何从ObservableCollection中删除项目?

时间:2012-08-01 13:42:06

标签: c# foreach ienumerable observablecollection enumerator

  

可能重复:
  What is the best way to modify a list in a foreach?

假设我有ObservableCollection mycollection并且我想通过枚举器执行某些操作,例如:

foreach(var x in mycollection)
{
   // This will do something based on data of x and remove x from mycollection
   x.Close();
}

方法Close()有一行代码 - mycollection.Remove(x);。当我运行此代码时,得到以下错误:

  

收藏被修改;枚举操作可能无法执行。

我无法更改方法Close(),因为它在应用程序的许多其他位置被调用。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

枚举集合时无法删除项目。 一个简单的解决方案是使用从最后一项到第一项的for循环并根据需要删除:

for (int i = myCollection.Count - 1; i >= 0; i--)
{
    var item = myCollection[i];
    if (ShouldDelete(item))
    {
        item.Close();
    }
}

答案 1 :(得分:2)

你可以通过两种方式来解决这个问题:

  1. 如果您不需要从列表中删除所有内容,请使用foreach填充单独的“要关闭的项目”列表,并为第二个列表中的每个项目调用.Close当你完成了。这样,您就可以避免在枚举时修改mycollection
  2. 如果您在列表中的每个项目上调用Close,请尝试相应:

    while (mycollection.Count > 0
    { 
         mycollection[0].Close()) 
    }
    

答案 2 :(得分:0)

在foreach中,请改用mycollection.ToList()