C#的列表<>有一组CopyTo函数,它们使用快速内存块副本将其内部数组的内容提取到另一个数组中。
有没有办法反过来做到这一点?它可能看起来像......
var buffer = new List<byte>();
buffer.AddRange(afewbytes);
buffer.AddFromArray(myArray, startIndex, countBytesToCopy);
buffer.AddRange(afewmorebytes);
由于我的List是List&lt; byte&gt;我希望避免使用逐字节复制的循环。
答案 0 :(得分:6)
List<T>(IEnumerable<T>)
构造函数将使用ICollection<T>.CopyTo
,如果集合实现ICollection<T>
,byte[]
将执行此操作。
如果您只想提取数组的 part ,那么这不会直接有用,但您可以创建自己的ByteArraySegment
类来实现ICollection<byte>
并实现{{ 1}}使用CopyTo
或其他任何操作:
Buffer.BlockCopy
然后:
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
}
(或使用具有相同优化的List<byte> bytes = new List<byte>(new ByteArraySegment(myArray, start, count));
。)
答案 1 :(得分:3)
List.AddRange(myArray)
应该非常有效。
From MSDN:“如果新的Count(当前Count加上集合的大小)将大于Capacity,则通过自动重新分配内部数组以容纳新元素来增加List的容量,并且在添加新元素之前将现有元素复制到新数组。“
答案 2 :(得分:0)
要复制数组的一部分,请将数组包装在ArraySegment
中,指定段的索引和计数。使用列表的ArraySegment
方法将AddRange
添加到列表中。 AddRange
将使用ArraySegment.CopyTo
,后者使用Array.Copy
,即fast。