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