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

C#将ListBox.SelectedItems复制到另一个变量,c#,windows,visual-studio-2017,C#,Windows,Visual Studio 2017,我犯了这个错误 System.InvalidOperationException:'此枚举数绑定到的列表已被修改。仅当列表未更改时,才能使用枚举数。” 因为在我的代码中,所选项目在迭代过程中会发生变化 代码很简单 var items = testListBox.SelectedItems; foreach (var item in items) { } 我想冻结变量中的items列表,这样如果它发生更改,foreach循环不会更改并创建此错误 问题是行var items=testListBo

我犯了这个错误

System.InvalidOperationException:'此枚举数绑定到的列表已被修改。仅当列表未更改时,才能使用枚举数。”

因为在我的代码中,所选项目在迭代过程中会发生变化

代码很简单

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

}
我想冻结变量中的items列表,这样如果它发生更改,
foreach
循环不会更改并创建此错误

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

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


谢谢,

您的代码创建了一个名为
items
的别名,该别名指的是
SelectedItems
。它不能复制

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

var items = testListBox.SelectedItems.ToList();
唉,WinForms集合太旧了,它们不支持
IEnumerable
,因此Linq也不完全支持它们。相反,首先将所选项目强制转换为
对象
(或任何其他适当类型):

var items=testListBox.SelectedItems.OfType().ToList();

不清楚您在
foreach
循环中执行的操作可能会导致您报告的错误。无法修改正在枚举的内容。但是,您可以枚举副本并修改原始副本(反之亦然)。

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

foreach (var item in items.ToArray())
{
    items.Add(new Item...);
}

for(int i=0;i
有关为什么会发生这种情况以及修改foreach循环中的项的最佳方法,请参阅,以获得深入的答案

foreach (var item in items.ToArray())
{
    items.Add(new Item...);
}
for (int i = 0; i < items.Count; i++)
{
    items.Add(new Item...);
}