3

可能重复:
在 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(),因为它在应用程序的许多其他地方被调用。我该如何解决这个问题?

4

3 回答 3

8

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

for (int i = myCollection.Count - 1; i >= 0; i--)
{
    var item = myCollection[i];
    if (ShouldDelete(item))
    {
        item.Close();
    }
}
于 2012-08-01T13:47:57.317 回答
2

有两种方法可以解决这个问题:

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

    while (mycollection.Count > 0
    { 
         mycollection[0].Close()) 
    }
    
于 2012-08-01T13:47:33.913 回答
0

在 foreach 中,mycollection.ToList()改为使用。

于 2012-08-01T13:46:45.023 回答