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

时间:2019-09-05 20:35:15

标签: c# windows visual-studio-2017

我遇到此错误

  

System.InvalidOperationException:'此枚举器绑定到的列表已被修改。仅在列表不变的情况下才能使用枚举器。'

因为在我的代码中,“选定项”在迭代过程中发生了变化

代码很简单

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

}

我想将项目列表冻结在一个变量中,这样,如果它改变了,foreach循环就不会改变并产生此错误

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

如何将SelectedItems列表克隆到另一个变量,这样如果SelectedItems列表更改,它就不会在foreach循环中崩溃

谢谢

2 个答案:

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