0

我有以下代码迭代字典,如果键没有值,它会检查另一个字典的值并分配它。我不断收到以下异常。

- $exception {"Collection was modified; enumeration operation may not execute."} System.Exception {System.InvalidOperationException}

foreach (KeyValuePair<string, string> param in request.Field.StoredProcedure.Parameters)
{
    if ((param.Value == null || param.Value.Length == 0) &&
         request.SearchParams.ContainsKey(param.Key))
    {
        request.Field.StoredProcedure.Parameters[param.Key] =
             request.SearchParams[param.Key];
    }
    else if (param.Value == null || param.Value.Length == 0)
    {
        throw new ArgumentException(
            "No value could be found for sproc parameter " + param.Key);
    }
}

在迭代集合时,您是否无法为集合分配值?

4

3 回答 3

6

在迭代集合时,您是否无法为集合分配值?

正确的。试试这个:

foreach (var param in request.Field.StoredProcedure.Parameters.ToList())
{
    ...

这是因为foreach使用枚举器,并且..

只要集合保持不变,枚举数就保持有效。如果对集合进行了更改,例如添加、修改或删除元素,则枚举器将不可恢复地失效,并且其行为未定义。

来源:http: //msdn.microsoft.com/en-us/library/system.collections.ienumerable.getenumerator.aspx

如果添加.ToList(),您现在正在枚举集合的副本,并且您可以修改原始内容而不影响副本。

于 2013-08-15T00:02:54.497 回答
2

在迭代集合时,您是否无法为集合分配值?

情况正是如此。您不能在使用 迭代集合时更改集合foreach

于 2013-08-15T00:02:47.417 回答
1

修改它正在查看的集合后,您不能使用枚举器,因为它可能会使枚举器处于无效状态。您应该能够获取内容的副本,.ToArray()然后修改KeyValuePair存储在其中的 s:

foreach (KeyValuePair<string, string> param in request.Field.StoredProcedure.Parameters.ToArray())
{
    if ((param.Value == null || param.Value.Length == 0) && request.SearchParams.ContainsKey(param.Key))
    {
        request.Field.StoredProcedure.Parameters[param.Key] = request.SearchParams[param.Key];
    }
    else if (param.Value == null || param.Value.Length == 0)
    {
        throw new ArgumentException("No value could be found for sproc parameter " + param.Key);
    }
}
于 2013-08-15T00:03:35.200 回答