Array.Copy vs Skip and Take в c # - PullRequest
       22

Array.Copy vs Skip and Take в c #

5 голосов
/ 09 сентября 2011

Я просматривал этот вопрос и некоторые похожие:

Получение подмассива из существующего массива

Во многих местах я читаю ответы, подобные этим:

Получение подмассива из существующего массива

Мне интересно, почему Skip и Take не являются операциями с постоянным временем для массивов?

В свою очередь, если бы они были операциями с постоянным временем, разве метод Skip и Take (без вызова ToArray () в конце) не будет иметь такое же время выполнения без дополнительных затрат на выполнение Array.Copy, но также с более эффективным использованием пространства?

1 Ответ

5 голосов
/ 09 сентября 2011

Вы должны различать работу, которую выполняют методы Skip и Take, и работу по использованию данных, возвращаемых методами.

Сами методы Skip и Take являются операциями O (1), так как выполняемая ими работа не масштабируется с размером ввода. Они просто устанавливают перечислитель, способный возвращать элементы из массива.

Это когда вы используете перечислитель, что работа сделана. Это операция O (n), где n - количество элементов, которые производит перечислитель. Поскольку счетчики читают из массива, они не содержат копии данных, и вы должны сохранять данные в массиве без изменений, пока вы используете перечислитель.

(Если вы используете Skip в коллекции, которая не доступна по индексу, например массиву, получение первого элемента является операцией O (n), где n - количество пропущенных элементов.)

...