关于修改集合的例外

时间:2013-08-14 23:58:58

标签: c# exception dictionary

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

- $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);
    }
}

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

3 个答案:

答案 0 :(得分:6)

  

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

正确。试试这个:

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

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

  

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

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

如果添加.ToList(),您现在可以枚举该集合的副本,并且可以在不影响副本的情况下修改原始文件。

答案 1 :(得分:2)

  

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

情况确实如此。使用foreach进行迭代时,您无法更改集合。

答案 2 :(得分:1)

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

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);
    }
}