C#'s List<> has a set of CopyTo functions that will extract the contents of its internal array into another array using a fast memory block copy.
Is there a way to do this in reverse? It might look like...
var buffer = new List<byte>();
buffer.AddRange(afewbytes);
buffer.AddFromArray(myArray, startIndex, countBytesToCopy);
buffer.AddRange(afewmorebytes);
As my List is the List<byte> variety, I'd prefer to avoid a loop that copies byte by byte.
The List<T>(IEnumerable<T>)
constructor will use ICollection<T>.CopyTo
if the collection implements ICollection<T>
, which byte[]
will do.
That's not going to help directly if you only want to extract part of the array, but you could create your own ByteArraySegment
class implementing ICollection<byte>
and implement the CopyTo
operation using Buffer.BlockCopy
or whatever:
public class ByteArraySegment : ICollection<byte>
{
private readonly byte[] array;
private readonly int start;
private readonly int count;
public ByteArraySegment(...)
{
// Obvious code
}
public void CopyTo(byte[] target, int index)
{
Buffer.BlockCopy(array, start, target, index, count);
}
// Other ICollection<T> members
}
Then:
List<byte> bytes = new List<byte>(new ByteArraySegment(myArray, start, count));
(Or use AddRange
which has the same optimization.)
See more on this question at Stackoverflow