c# - 集合被修改;从 LIstBox 中删除 ListItem 时枚举可能不会执行错误

标签 c# .net ienumerable

我有两个列表框,lstAvailableColors 和 lstSelectedColors。每个列表框之间有两个按钮,添加和删除。当在 lstAvailableColors 中选择一种或多种颜色并单击“添加”按钮时,我想将它们从 lstAvailableColors 中删除并在 lstSelectedColors 中显示。此外,如果在 lstSelectedColors 中选择了颜色并单击了删除按钮,我想从 lstSelectedColors 中删除颜色并将它们添加回 lstAvailableColors。当我这样做时,删除项目时出现以下错误:

集合已修改;枚举操作可能不会执行。

这是添加按钮和删除按钮的代码:

添加:

protected void btnAdd_Click(object sender, EventArgs e)
{
    foreach (ListItem item in lstAvailableColors.Items)
    {
        if (item.Selected)
        {
            lstSelectedColors.Items.Add(item);
            lstAvailableColors.Items.Remove(item);
        }
    }
}

删除:

protected void btnRemove_Click(object sender, EventArgs e)
{
    foreach (ListItem item in lstSelectedColors.Items)
    {
        if (item.Selected)
        {
            lstAvailableColors.Items.Add(item);
            lstSelectedColors.Items.Remove(item);
        }
    }
}

最佳答案

在 .Net 中枚举集合时,无法修改集合。您需要分离出您的枚举并将代码删除到不同的 block 中。这是一个快速示例,说明如何在没有 LINQ 的情况下执行此操作

protected void btnAdd_Click(object sender, EventArgs e)
{
    var selected = new List<ListItem>();
    foreach (ListItem item in lstAvailableColors.Items)
    {
        if (item.Selected)
        {
            selected.Add(item);
            lstSelectedColors.Items.Add(item);
        }
    }
    foreach (ListItem item in selected)
    {
        lstAvailableColors.Items.Remove(item);
    }
}

这是一个使用 LINQ 的更简洁的版本

var selected = lstAvailableColors.Cast<ListItem>().Where(i => i.Selected).ToList();
selected.ForEach( x => { lstSelectedColors.Items.Add(x); });
selected.ForEach( x => { lstAvailableColors.Items.Remove(x);});

编辑

LINQ 版本分为两个部分。第一部分是查找当前选定项并将值存储在 List<ListItem> 中的第一行.该行包含 .ToList() 调用非常重要,因为这会强制查询立即执行而不是延迟执行。

接下来的两行遍历每个被选中的值,并将其删除或添加到适当的列表中。因为选择的列表已经存储,所以我们在修改它时不再枚举集合。

关于c# - 集合被修改;从 LIstBox 中删除 ListItem 时枚举可能不会执行错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/808006/

相关文章:

c# - 硬编码的 ApplicationInsightsResourceId 如何影响从不同生产级别的资源中收集 AI 数据?

c# - Xamarin.Forms MVVM Light IDialogService ShowMessage 抛出 native 异常

c# - 表值参数插入性能不佳

c# - yield return 仅适用于 IEnumerable<T>?

c# - 文件系统观察者 IOException

c# - 服务总线主题插入了相同 MessageId 的重复消息记录

c# - 如何使用 .Net 让窗口保持在顶部?

c# - 将 .NET 泛型列表转换为其他泛型列表时遇到问题

c# - 是否有一个 IEnumerable 实现只迭代一次它的源代码(例如 LINQ)?

c# - Array.Count() 比 List.Count() 慢得多