Мне серьезно нужно перестать отвечать на вопросы прямо перед сном.
орое время назад я написалIList
метод расширения для перечисления по части списка с использованием индексов. Во время рефакторинга я понял, что аналогичный запрос можно выполнить, вызвавSkip(toSkip).Take(amount)
, Во время тестирования я заметил, чтоSkip
не оптимизирован дляIList
, Немного погуглив, я оказался на посту Джона Скита,обсуждая, почему оптимизирующие методы, такие какSkip
опасный.
Насколько я понимаю в статье, проблема не в том, что исключение возникает в оптимизированных методах при изменении коллекции, но в качестве комментария говорится, что документация msdn сама конфликтует.
Если в коллекцию вносятся изменения, такие как добавление, изменение или удаление элементов, перечислитель безвозвратно аннулируется и при следующем вызове MoveNext или Resetсоздает исключение InvalidOperationException.
ВIEnumerator.GetEnumerator ():
Если в коллекцию вносятся изменения, такие как добавление, изменение или удаление элементов, перечислитель безвозвратно аннулируется и его поведениене определено.
Я вижу достоинства в обоих соглашениях, и я немного растерян, оптимизировать или нет. Что такое правильное решение? Я рассматривалIList.AssumeImmutable()
подход по линииAsParallel()
как упомянуто Крисом Вандермоттеном в комментариях. Есть ли реализация, или это плохая идея?