Me he encontrado con algunos casos de errores Collection was modified; enumeration operation may not execute
al devolver los resultados de una consulta LINQ en una función, como esta ... (Debo añadir que la función actúa como una implementación de una interfaz y los resultados abandonan este módulo para ser utilizado en otro.)¿Debo siempre invocar .ToArray en los resultados de la consulta LINQ devueltos en una función?
Public Function GetTheFuzzyFuzzbuzzes() As IEnumerable(of FuzzBuzz) _
Implements IFoo.GetTheFuzzyFuzzBuzzes
Return mySecretDataSource.Where(Function(x) x.IsFuzzy)
End Function
¿Debo, por regla general, siempre llame .ToArray
al devolver el resultado de la consulta LINQ en una función o propiedad getter si los datos subyacente tiene potencial para ser cambiado? Sé que hay un poco de eficiencia al hacer esto, pero tengo la sensación de que es seguro lo que hay que hacer y, por lo tanto, siempre se debe hacer para evitar problemas de acoplamiento temporal.
Editar:
Déjame hacer un mejor trabajo para explicar el dominio del problema.
Tenemos una implementación basada en gráficos de nuestra principal área de preocupación, que es un problema de optimización. Las entidades se representan como nodos gráficos. Los bordes ponderados con varios costos y otros parámetros expresan las relaciones entre los nodos. A medida que el usuario manipula los datos, creamos diferentes bordes y evaluamos las diversas opciones que pueden tomar contra el estado actual para darles retroalimentación sobre los resultados de cada opción. Los cambios realizados en los datos en el servidor por otros usuarios y programas se propagan inmediatamente al cliente a través de la tecnología de inserción. Usamos muchos subprocesos ...
... todo esto significa que tenemos muchas cosas sucediendo de forma muy asincrónica.
Nuestro programa se divide en módulos (basados en el principio de responsabilidad única) con un proyecto de contrato y un proyecto de implementación resuelto en tiempo de ejecución, lo que significa que dependemos en gran medida de las interfaces. Normalmente pasamos los datos entre los módulos usando IEnumerable (ya que son kind-of-sort-of inmutables).
¿podría publicar una versión pequeña y compilable de un programa que reproduzca esto? –
Desafortunadamente, nuestra base de código es como 50000+ LOC con 68 proyectos, por lo que producir un buen ejemplo será un poco difícil. Vea el detalle expandido en la pregunta. –