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

标签 c# windows visual-studio-2017

我遇到了这个错误

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 中可能在做什么循环导致您报告的错误。您不能修改正在枚举的内容。但是,您可以枚举副本并修改原始副本(反之亦然)。

关于C# 将 ListBox.SelectedItems 复制到另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57812659/

相关文章:

c# - 在达到特定字符之前如何获取字符?

c++ - 限制多线程应用程序的处理器数量

windows - 如何在 Windows 上将控制台输入 ( yes/no ) 作为批处理文件的一部分提供。

visual-studio-2017 - 评估函数 'function' 超时

c# - Nuget 未检索任何包,甚至未连接到 api.nuget.org

c# - 如何检测/找到 while 循环的结束?

c# - 将 native C++ 移植到 .NET

c# - 依赖注入(inject)与泛型相结合

python - 如何让cmd正确显示阿拉伯文字?

windows - 为什么 Visual Studio 2017 在启动时打开 Windows "For developers"设置?