Добавить два или более байтовых массивов в C #

как насчет ...

Photo.objects.filter(complaint__isnull=False)

из https://docs.djangoproject.com/en/dev/topics/db/queries/

30
задан Peter Mortensen 27 April 2016 в 14:54
поделиться

8 ответов

Вы хотите BlockCopy

Согласно это сообщение в блоге , это быстрее, чем Array.CopyTo.

24
ответ дан 27 November 2019 в 23:39
поделиться

Вы также можете использовать подход с MemoryStream. Предположим, что b1 и b2 - двухбайтовые массивы, вы можете получить новый, b3, используя MemoryStream следующим образом:

var s = new MemoryStream();
s.Write(b1, 0, b1.Length);
s.Write(b2, 0, b2.Length);
var b3 = s.ToArray();

Это должно работать без LINQ и на самом деле немного быстрее.

15
ответ дан 27 November 2019 в 23:39
поделиться

Создайте новый MemoryStream , передав в конструктор буфер, размер которого точно совпадает с размером объединенного. Запишите отдельные массивы, а затем, наконец, используйте буфер:

byte[] deadBeef = new byte[] { 0xDE, 0xAD, 0xBE, 0xEF};
byte[] baadF00d = new byte[] { 0xBA, 0xAD, 0xF0, 0x0D};
int newSize = deadBeef.Length + baadF00d.Length;
var ms = new MemoryStream(new byte[newSize], 0, newSize, true, true);
ms.Write(deadBeef, 0, deadBeef.Length);
ms.Write(baadF00d, 0, baadF00d.Length);
byte[] merged = ms.GetBuffer();

Многие низкоуровневые функции ввода-вывода в .NET принимают массивы байтов и смещения. Это было сделано для предотвращения ненужных копий. Убедитесь, что вам действительно нужен объединенный массив, если он чувствителен к производительности, в противном случае просто используйте буферы и смещения.

11
ответ дан 27 November 2019 в 23:39
поделиться

Другой вариант, хотя я не тестировал его, чтобы увидеть, как он работает с точки зрения скорости и потребления памяти, будет подход LINQ:

byte[] combined = bytesOne.Concat(bytesTwo).Concat(bytesThree).ToArray();

... где bytesOne, bytesTwo и bytesThree - это байтовые массивы. Поскольку Concat использует отложенное выполнение, он не должен создавать никаких промежуточных массивов, и он не должен дублировать исходные массивы до тех пор, пока не будет создан окончательный объединенный массив в конце.

Изменить: LINQBridge позволит вам для использования LINQ-to-Objects (что является примером) в структуре 2.0. Я понимаю, если вы не хотите зависеть от этого, но это вариант.

6
ответ дан 27 November 2019 в 23:39
поделиться

Если у вас есть массивы, размер которых время от времени будет меняться, вам, вероятно, лучше использовать Перечислите в первую очередь. Затем вы можете просто вызвать метод списка AddRange () .

В противном случае Array.Copy () или Array.CopyTo () так же хороши, как и все остальное, что вы, вероятно, увидите.

3
ответ дан 27 November 2019 в 23:39
поделиться

Нужно ли вам, чтобы вывод действительно представлял собой массив байтов?

Если нет, вы можете создать себе «умный курсор» (который аналогичен тому, что делает LINQ): Создайте собственный IEnumerator , который сначала выполнит итерацию по первому массиву и просто продолжит работу со вторым без прерывания.

Это будет работать в среде 2.0, будет быстро (в том смысле, что объединение массивов практически не требует затрат) и не будет использовать ОЗУ больше, чем уже потребляют массивы.

2
ответ дан 27 November 2019 в 23:39
поделиться

Вы учили использовать List или ArrayList вместо Array? С помощью этих типов они могут увеличиваться или уменьшаться и добавляться через InsertRange

.
2
ответ дан 27 November 2019 в 23:39
поделиться

Your first option of making the first array large enough to contain the second array and using Array.CopyTo ends up being roughly the same as manually iterating over each item and making the assignment. Array.CopyTo() just makes it more concise.

Converting to string and back to array will be horribly slow in contrast to the above. And would likely use more memory.

0
ответ дан 27 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: