【问题标题】:Set property in value of sorted dictionary while iterating it迭代时在排序字典的值中设置属性
【发布时间】:2013-10-17 14:56:34
【问题描述】:

我定义了一个 SortedDictionary:

private SortedDictionary<int, SingleQcCalculation> m_dicTagsToCalc;

我正在迭代它并在值内设置一个属性:

foreach (KeyValuePair<int, SingleQcCalculation> pairSingleCalc in m_dicTagsToCalc)
{
    try 
    {                        
        pairSingleCalc.Value.m_QCtoCalc.m_CurGroupID = pairSingleCalc.Value.m_ChangedQcGroupId;
        pairSingleCalc.Value.m_QCtoCalc.CalculateQCExpression(pairSingleCalc.Value.m_OPCChangeTime, pairSingleCalc.Value.m_calcTime);
    }
    catch (Exception ex)
    {
        logger.Error(LogTopicEnum.DA,"Error calculating calced QC (id=" + pairSingleCalc.Value.m_QCtoCalc.ID.ToString() + ")" , ex);
    }
}

由于某种原因,我得到了这个异常:

DoQCsCalculations: error while calculating calced tags
System.InvalidOperationException: Collection was modified after the enumerator was instantiated.
   at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   at System.Collections.Generic.SortedSet`1.Enumerator.MoveNext()

现在,我没有更改字典中的值或键,没有 其他线程使用字典。

为什么会出现这个错误?

谢谢, 奥马尔

【问题讨论】:

  • 你在什么属性上排序?
  • @RobG ,SortedDictionary 按键排序,我正在使用此默认排序行为。
  • @VladimirFrolov ,我没有更改值,只是其中的属性
  • 这必须有效。至少在达到 CalculateQCExpression 之前。你一步步调试过这个吗? CalculateQCExpression 中有什么?
  • 看,如果被您提供的代码示例捕获,抛出的异常消息不是应该显示的消息:它不同于“calced QC (id="。它是由计算QCExpression ?

标签: c# .net dictionary enumeration sorteddictionary


【解决方案1】:

改变字典中的值本身不会导致抛出此异常。您必须添加或删除密钥对才能引发该异常。

即使您更改了一个键,它也不会抛出此异常,它只是(可能)无法正常运行,因为它无法正确找到项目。

理想情况下,如果您正在调用的函数正在向字典中添加对,则它应该从方法中返回这些键对,然后调用者可以存储这些值并在循环结束后添加它们,而不是改变枚举时的字典。

【讨论】:

  • 虽然我还没有找到实际的错误,但我接受你的回答,因为现在我确定问题在于代码中的某处字典项已更改。谢谢
【解决方案2】:

简单地而不是遍历字典,遍历键并将键用作字典的索引。

【讨论】:

    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多