listOfByteArrs.SelectMany(byteArr=>byteArr).ToArray()
Powyższy kod połączy sekwencję ciągów bajtów w jedną sekwencję - i zapisze wynik w tablicy.
Choć czytelny, to nie jest maksymalnie wydajny - to nie korzystając z faktu, że już wiedzą długości wynikowej tablicy bajtów, a tym samym pozwala uniknąć dynamicznie rozszerzony .ToArray()
realizację że koniecznie wymaga wielu przydziałów i array- kopie. Ponadto, SelectMany
jest zaimplementowany w kategoriach iteratorów; oznacza to wiele + wiele wywołań interfejsu, które są dość powolne. Jednak w przypadku małych rozmiarów zestawów danych jest to mało prawdopodobne.
Jeśli trzeba szybszą realizację można wykonać następujące czynności:
var output = new byte[listOfByteArrs.Sum(arr=>arr.Length)];
int writeIdx=0;
foreach(var byteArr in listOfByteArrs) {
byteArr.CopyTo(output, writeIdx);
writeIdx += byteArr.Length;
}
lub Martinho proponuje:
var output = new byte[listOfByteArrs.Sum(arr => arr.Length)];
using(var stream = new MemoryStream(output))
foreach (var bytes in listOfByteArrs)
stream.Write(bytes, 0, bytes.Length);
Niektóre czasy:
var listOfByteArrs = Enumerable.Range(1,1000)
.Select(i=>Enumerable.Range(0,i).Select(x=>(byte)x).ToArray()).ToList();
Korzystanie krótka Metoda łączenia tych 500500 bajtów zajmuje 15 ms, używając fa Metoda st zajmuje 0,5ms na moim komputerze - YMMV, i zauważ, że dla wielu aplikacji oba są wystarczająco szybkie ;-).
Wreszcie, można zastąpić Array.CopyTo
z static
Array.Copy
, niskiego poziomu Buffer.BlockCopy
albo MemoryStream
z powrotem zdefiniowanej przez bufor - to wszystko wykonać prawie identycznie na moich testów (64 .NET 4.0).
Chociaż krótki i wyraźny, należy pamiętać, że ten kod jest bardzo powolny w porównaniu do tradycyjnego rozwiązania. Jeśli jest wystarczająco szybki, świetny, ale może nie być wystarczająco szybki. –
Jakie jest "tradycyjne rozwiązanie"? – amalgamate
"Tradycyjne" rozwiązanie byłoby prawdopodobnie ręczne, zagnieżdżone dla pętli. To około trzy razy wolniej niż rozwiązania oparte na kopiach, ale wciąż 10 razy szybciej niż "SelectMany". –