C# 复制 ListBox.SelectedItems 到另一个变量

C# Copy ListBox.SelectedItems to another variable

我遇到了这个错误

System.InvalidOperationException: 'List that this enumerator is bound to has been modified. An enumerator can only be used if the list does not change.'

因为在我的代码中,Selected Items 在迭代过程中发生变化

代码简单

var items = testListBox.SelectedItems;
foreach (var item in items)
{

}

我想将项目列表冻结在一个变量中,这样即使它发生变化,foreach 循环也不会发生变化并产生此错误

问题是行 var items = testListBox.SelectedItems; 似乎不起作用,因为出于某种原因它仍然给我这个错误

如何将 SelectedItems 列表克隆到另一个变量,以便在 SelectedItems 列表更改时它不会在 foreach 循环中崩溃

谢谢,

您的代码创建了一个名为 items 的别名,它引用 SelectedItems。它不复制。

似乎一个简单的解决方法是:

var items = testListBox.SelectedItems.ToList();

唉,WinForms 集合太旧了,它们不支持 IEnumerable<T>,因此 Linq 不完全支持。相反,首先将所选项目转换为 object(或任何其他适当的类型):

var items = testListBox.SelectedItems.OfType<object>().ToList();

不清楚您在 foreach 循环中可能做了什么导致您报告的错误。您不能修改正在枚举的内容。但是,您可以枚举副本并修改原始副本(反之亦然)。

您可以采取多种措施来解决此问题,例如:

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 循环中修改项目的最佳方法是什么。