Si estás utilizando un diccionario en lugar de una tabla hash, por lo que el tipo de las claves es conocido, la forma más fácil de hacer una copia de la colección Claves para evitar esta excepción es:
foreach (string key in new List<string>(dictionary.Keys))
¿Por qué recibes una excepción diciéndote que has modificado la colección sobre la que estás iterando, cuando en realidad no la has modificado?
Internamente, la clase Hashtable tiene un campo de versión. Los métodos Agregar, Insertar y Eliminar incrementan esta versión. Cuando crea un enumerador en cualquiera de las colecciones que expone el Hashtable, el objeto enumerador incluye la versión actual de Hashtable. El método MoveNext del enumerador comprueba la versión del enumerador frente a la Hashtable, y si no son iguales, arroja la InvalidOperationException que está viendo.
Este es un mecanismo muy simple para determinar si la Hashtable ha sido o no modificada. De hecho, es un poco demasiado simple. La colección Keys realmente debería mantener su propia versión, y su método GetEnumerator debería guardar la versión de la colección en el enumerador, no la versión de la Hashtable.
Hay otro defecto de diseño más sutil en este enfoque. La versión es un Int32. El método UpdateVersion no verifica límites. Por lo tanto, es posible, si realiza exactamente el número correcto de modificaciones en el Hashtable (2 veces Int32.MaxValue
, dar o recibir), para que la versión en el Hashtable y el enumerador sea la misma aunque haya cambiado radicalmente el Hashtable desde la creación el enumerador Por lo tanto, el método MoveNext no arrojará la excepción aunque debería hacerlo, y obtendrá resultados inesperados.
creen que esto es una cuestión de la duplicación ver: http://stackoverflow.com/questions/287195/how-to-add-items-to-a-collection -mientras lo consume –