Задать свойство в значении отсортированного словаря при его повторении

Я определил 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()

Теперь я не изменяю значения или ключи в словаре, нет других потоков, использующих словарь.

Почему я получаю эту ошибку?

Спасибо Омер

2 ответа

Решение

Отключение значения в словаре само по себе не приведет к возникновению этого исключения. Вы должны либо добавить, либо удалить пару ключей для того исключения.

Даже если вы измените ключ, он не выдаст это исключение, он просто (потенциально) не будет работать должным образом, так как не сможет правильно найти элементы.

В идеале, если вызываемая вами функция добавляет пары в словарь, она должна вместо этого возвращать эти пары ключей из метода, и вызывающая сторона может затем сохранить эти значения и добавить их после окончания цикла, а не изменять словарь Вы перечисляете это.

Просто вместо того, чтобы перебирать словарь, перебирайте ключи и используйте ключи как указатель к словарю.

Другие вопросы по тегам