Я столкнулся с довольно многими случаями ошибок Collection was modified; enumeration operation may not execute
при возврате результатов запроса LINQ в функции, вроде этого... (Я должен добавить, что функция действует как реализация интерфейса и результатов оставьте этот модуль для использования в другом.)
Public Function GetTheFuzzyFuzzbuzzes() As IEnumerable(of FuzzBuzz) _
Implements IFoo.GetTheFuzzyFuzzBuzzes
Return mySecretDataSource.Where(Function(x) x.IsFuzzy)
End Function
Должен ли я, как правило, всегда вызывать .ToArray
при возврате результата запроса LINQ в функцию или свойство getter, если базовые данные могут быть изменены? Я знаю, что в этом есть что-то полезное, но я чувствую, что это безопасно, и поэтому всегда нужно делать, чтобы избежать проблем с временными связями.
Edit:
Позвольте мне лучше описать проблемную область.
У нас есть основанная на графе реализация нашей основной проблемы, которая является проблемой оптимизации. Объекты представлены как узлы графа. Края, взвешенные с различными затратами и другими параметрами, выражают отношения между узлами. Когда пользователь манипулирует данными, мы создаем разные ребра и оцениваем различные параметры, которые они могут принимать против текущего состояния, чтобы дать им обратную связь по каждому результату. Изменения, внесенные в данные на сервере другими пользователями и программами, немедленно передаются клиенту с помощью технологии push. Мы используем много потоков...
... все это означает, что у нас много чего происходит очень асинхронно.
Наша программа разделена на модули (основанные на принципе единой ответственности) с проектом контракта и проектом внедрения на время выполнения, что означает, что мы в значительной степени полагаемся на интерфейсы. Обычно мы передаем данные между модулями, используя IEnumerable (поскольку они являются своеобразными неизменяемыми).