Мне серьезно нужно перестать отвечать на вопросы прямо перед сном.

орое время назад я написалIList метод расширения для перечисления по части списка с использованием индексов. Во время рефакторинга я понял, что аналогичный запрос можно выполнить, вызвавSkip(toSkip).Take(amount), Во время тестирования я заметил, чтоSkip не оптимизирован дляIList, Немного погуглив, я оказался на посту Джона Скита,обсуждая, почему оптимизирующие методы, такие какSkip опасный.

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

ВIEnumerator.MoveNext ():

Если в коллекцию вносятся изменения, такие как добавление, изменение или удаление элементов, перечислитель безвозвратно аннулируется и при следующем вызове MoveNext или Resetсоздает исключение InvalidOperationException.

ВIEnumerator.GetEnumerator ():

Если в коллекцию вносятся изменения, такие как добавление, изменение или удаление элементов, перечислитель безвозвратно аннулируется и его поведениене определено.

Я вижу достоинства в обоих соглашениях, и я немного растерян, оптимизировать или нет. Что такое правильное решение? Я рассматривалIList.AssumeImmutable() подход по линииAsParallel() как упомянуто Крисом Вандермоттеном в комментариях. Есть ли реализация, или это плохая идея?

Ответы на вопрос(2)

Ваш ответ на вопрос