РЕДАКТИРОВАТЬ: Как отмечается в комментарии nobugz (и в ответе Рида Копси), если вам на самом деле не нужен результат в виде байтового массива, вы должны использовать ArraySegment<T>
:
ArraySegment<byte> segment = new ArraySegment<byte>(full, 16, full.Length - 16);
В противном случае будет необходимо копирование - массивы всегда имеют фиксированный размер, поэтому вы не можете «удалить» первые 16 байтов из существующего массива. Вместо этого вам придется создать новый меньший массив и скопировать в него соответствующие данные.
Предложение Зака в правильном направлении для подхода без LINQ, но его можно упростить (предполагается, что вы уже знаете, что исходный массив имеет длину не менее 16 байт):
byte[] newArray = new byte[oldArray.Length - 16];
Buffer.BlockCopy(oldArray, 16, newArray, 0, newArray.Length);
или
byte[] newArray = new byte[oldArray.Length - 16];
Array.Copy(oldArray, 16, newArray, 0, newArray.Length);
Я подозреваю, Buffer.BlockCopy
будет немного быстрее, но я точно не знаю.
Обратите внимание, что оба из них могут быть значительно более эффективными, чем подход LINQ, если задействованные массивы большие: подход LINQ требует, чтобы каждый байт был индивидуально возвращен из итератора, и потенциально промежуточные копии должны быть сделаны (таким же образом так как при добавлении элементов в List<T>
необходимо периодически увеличивать резервный массив). Очевидно, что не оптимизируйте микро, но стоит проверить , если этот бит кода является узким местом производительности.
РЕДАКТИРОВАТЬ: я провел очень "быстрый и грязный" тест из трех подходов. Я не доверяю тестам, чтобы различать Buffer.BlockCopy
и Array.Copy
- они были довольно близки - но подход LINQ был более чем в 100 раз медленнее.
На моем ноутбуке, использующем байтовые массивы из 10 000 элементов, для выполнения 40000 копий с использованием LINQ потребовалось почти 10 секунд; вышеупомянутые подходы заняли около 80 мсек, чтобы выполнить тот же объем работы. Я увеличил количество итераций до 4 000 000, и это заняло всего около 7 секунд. Очевидно, что применяются обычные предостережения относительно микро-эталонов, но это довольно существенная разница.
Определенно используйте вышеуказанный подход, если он находится в пути кода, который важен для производительности:)