Foreach循环遍历列表的错误

jkr*_*r01 2 c# foreach list invalidoperationexception argumentexception

我有以下代码给我提出问题,我将不胜感激任何帮助:

private static string CreateOptionString(List<VehicleOption> Options)
{
    StringBuilder returnValue = new StringBuilder();
    foreach (VehicleOption option in Options)
    {
        if (option.OptionStatus == ExtendedResponse.OptionState.Included)
        {
            if (returnValue.Length > 0)
            {
                returnValue.Append(", ");
            }
            returnValue.Append(option.OptionName);
        }
    }
    return returnValue.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我最初的问题是我得到了一个System.InvalidOperationException:我的foreach循环上的集合被修改了错误.

1)我仍然无法弄清楚为什么我会得到这个错误,因为我没有看到它被修改的任何地方.

有人建议我将List复制到一个新List并循环遍历新List.我做到了,它摆脱了InvalidOperationException.但是,我试着以不同的方式处理列表,并且两者都给了我一个System.ArgumentException:目标数组不够长.以下是我尝试复制列表的两种方法

List<VehicleOption> newOptions = new List<VehicleOption>(Options);
Run Code Online (Sandbox Code Playgroud)

List<VehicleOption> newOptions = new List<VehicleOption>();
newOptions.AddRange(Options);
Run Code Online (Sandbox Code Playgroud)

这两个都给了我一个System.ArgumentException:Destination数组不够长.

2)为什么这些方法中的任何一个都会给我这个例外?

任何帮助将不胜感激,因为我很难过.

谢谢!

Sim*_*Var 5

确保在迭代时没有其他线程正在更改集合.

另外,另一种方法是:

return string.Join(", ", options.Where(
    op => op.OptionStatus == ExtendedResponse.OptionState.Included));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,哪个更好(并且令人惊讶地)比使用StringBuilder更快.

尽管如此,这并不能解决您的问题 - 这可能是由更改集合的不同线程引起的.

我的第一次尝试是:

private static string CreateOptionString(List<VehicleOption> Options)
{
    lock (Options)
    {
        return string.Join(", ", options.Where(
            op => op.OptionStatus == ExtendedResponse.OptionState.Included));
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当然,如果我们有关于其他线程的任何信息搞乱该集合,那么提供更好的线程安全解决方案会更容易.