Оптимизация LINQ для IList

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

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

В IEnumerator.MoveNext () :

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

В IEnumerator.GetEnumerator () :

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

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

9
задан Gabe 5 June 2011 в 08:27
поделиться