Вставьте байтовый массив в другой байтовый массив в определенной позиции с помощью c # - PullRequest
5 голосов
/ 06 января 2011

Это может быть глупый вопрос, но простой ответ пока не найден ...

Я пытаюсь вставить простой байтовый массив c # в другой байтовый массив в определенной позиции.Например, существующие байты должны быть не переопределены, а просто перемещены дальше назад.На самом деле, так же, как вы копируете страницу некоторый текстовый блок внутри существующего текстового блока.

  1. Пока что я бы создал новый массив с длиной обоих существующих массивов.
  2. Скопируйте первыймассив в новый до позиции, где начинается вставка.
  3. Добавить вставленный массив
  4. Добавить оставшуюся часть существующего массива.

Но я бы предположилэто что-то общее и должно быть проще?Или я не прав?

Ответы [ 6 ]

8 голосов
/ 06 января 2011

Но я бы предположил, что это что-то обычное

Если вы вставляете большой кусок данных в середину другого большого блока данных, то вы часто делаете это, тогда вы можете подумать об использованииструктура данных предназначена для этого.Массив предназначен для фиксированного размера и изменяемого содержимого .Если ваше требование включает «переменную по размеру», тогда массив - это неправильный тип данных для вас.Вместо этого рассмотрим двусвязный список или защищаемую деку.

и должно быть проще?

Вы определили тривиальный четырехшаговый алгоритм, который делает то, что вы хотите.Это не намного легче, чем это.

6 голосов
/ 06 января 2011

Используйте List<byte> вместо byte[]; это обеспечит гибкость, которую вы ищете ...

List<byte> b1 = new List<byte>() { 45, 46, 47, 50, 51, 52 };
List<byte> b2 = new List<byte> { 48, 49 };
b1.InsertRange(3, b2);

Тогда, если вам нужно вернуться к byte[], по любой причине вы можете позвонить ...

b1.ToArray();
4 голосов
/ 06 января 2011

Посмотрите на Array.CopyTo.

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

1 голос
/ 06 января 2011

Если производительность не важна, подумайте:

var combined = first.Take(insertPosition)
                    .Concat(second)
                    .Concat(first.Skip(insertPosition))
                    .ToArray();

Полагаю, это почти четыре шага, которые вы предложили, за исключением первого шага "приходит в конце".Однако обратите внимание, что это неэффективно по ряду причин, включая ненужный динамический буфер и избыточное частичное перечисление первого массива.

В противном случае, то, что вы предложили, прекрасно.

0 голосов
/ 06 января 2011

Массив по определению имеет фиксированный размер .Вы не можете вставлять или удалять элементы, просто перезаписывать элементы.

Вместо этого вы должны list Списки предоставляют методы для вставки или удаления элементов и поддиапазонов.

0 голосов
/ 06 января 2011

Если бы вы могли обменять свой объект на что-то немного большее, вы могли бы смотреть на такие вещи, как List, у которого есть метод InsertRange, который делает то, что вы хотите (http://msdn.microsoft.com/en-us/library/884ee1fz.aspx). Конечно, использование другого объекта может быть не вариант, но егопредложение для простого способа сделать вещи. Также другие объекты могут быть более полезными. Магазин вокруг ...:)

...