我有以下代码迭代字典,如果密钥没有值,它会检查另一个字典中的值并分配它。我不断收到以下异常。
- $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);
}
}
在迭代它时,您是否无法为集合分配值?
答案 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);
}
}