我遇到此错误
System.InvalidOperationException:'此枚举器绑定到的列表已被修改。仅在列表不变的情况下才能使用枚举器。'
因为在我的代码中,“选定项”在迭代过程中发生了变化
代码很简单
var items = testListBox.SelectedItems;
foreach (var item in items)
{
}
我想将项目列表冻结在一个变量中,这样,如果它改变了,foreach
循环就不会改变并产生此错误
问题是var items = testListBox.SelectedItems;
行似乎不起作用,因为出于某种原因它仍然给我这个错误
如何将SelectedItems列表克隆到另一个变量,这样如果SelectedItems列表更改,它就不会在foreach循环中崩溃
谢谢
答案 0 :(得分:2)
您的代码创建一个名为items
的别名,该别名引用SelectedItems
。它不会复制。
似乎很容易解决:
var items = testListBox.SelectedItems.ToList();
A,WinForms集合太旧了,它们不支持IEnumerable<T>
,因此Linq也不完全支持。相反,请先将所选项目转换为object
(或其他任何适当的类型):
var items = testListBox.SelectedItems.OfType<object>().ToList();
目前尚不清楚您在foreach
循环中可能会执行什么操作,从而导致报告错误。您无法修改要枚举的内容。但是,您可以枚举副本并修改原始副本(反之亦然)。
答案 1 :(得分:1)
您可以采取各种措施来解决此问题,例如:
foreach (var item in items.ToArray())
{
items.Add(new Item...);
}
或
for (int i = 0; i < items.Count; i++)
{
items.Add(new Item...);
}
请参见What is the best way to modify a list in a 'foreach' loop?,深入了解为什么会发生这种情况以及在foreach循环中修改项目的最佳方法是什么。