假设我有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()
,因为它在应用程序的许多其他位置被调用。我该如何解决这个问题?
答案 0 :(得分:7)
枚举集合时无法删除项目。
一个简单的解决方案是使用从最后一项到第一项的for
循环并根据需要删除:
for (int i = myCollection.Count - 1; i >= 0; i--)
{
var item = myCollection[i];
if (ShouldDelete(item))
{
item.Close();
}
}
答案 1 :(得分:2)
你可以通过两种方式来解决这个问题:
foreach
填充单独的“要关闭的项目”列表,并为第二个列表中的每个项目调用.Close
当你完成了。这样,您就可以避免在枚举时修改mycollection
。如果您在列表中的每个项目上调用Close
,请尝试相应:
while (mycollection.Count > 0
{
mycollection[0].Close())
}
答案 2 :(得分:0)
在foreach中,请改用mycollection.ToList()
。