как насчет ...
Photo.objects.filter(complaint__isnull=False)
Вы хотите BlockCopy
Согласно это сообщение в блоге , это быстрее, чем Array.CopyTo.
Вы также можете использовать подход с 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 и на самом деле немного быстрее.
Создайте новый 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 принимают массивы байтов и смещения. Это было сделано для предотвращения ненужных копий. Убедитесь, что вам действительно нужен объединенный массив, если он чувствителен к производительности, в противном случае просто используйте буферы и смещения.
Другой вариант, хотя я не тестировал его, чтобы увидеть, как он работает с точки зрения скорости и потребления памяти, будет подход LINQ:
byte[] combined = bytesOne.Concat(bytesTwo).Concat(bytesThree).ToArray();
... где bytesOne, bytesTwo и bytesThree - это байтовые массивы. Поскольку Concat использует отложенное выполнение, он не должен создавать никаких промежуточных массивов, и он не должен дублировать исходные массивы до тех пор, пока не будет создан окончательный объединенный массив в конце.
Изменить: LINQBridge позволит вам для использования LINQ-to-Objects (что является примером) в структуре 2.0. Я понимаю, если вы не хотите зависеть от этого, но это вариант.
Если у вас есть массивы, размер которых время от времени будет меняться, вам, вероятно, лучше использовать Перечислите
в первую очередь. Затем вы можете просто вызвать метод списка AddRange ()
.
В противном случае Array.Copy () или Array.CopyTo () так же хороши, как и все остальное, что вы, вероятно, увидите.
Нужно ли вам, чтобы вывод действительно представлял собой массив байтов?
Если нет, вы можете создать себе «умный курсор» (который аналогичен тому, что делает LINQ): Создайте собственный IEnumerator
Это будет работать в среде 2.0, будет быстро (в том смысле, что объединение массивов практически не требует затрат) и не будет использовать ОЗУ больше, чем уже потребляют массивы.
Вы учили использовать List или ArrayList вместо Array? С помощью этих типов они могут увеличиваться или уменьшаться и добавляться через InsertRange
.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.