将数组的一部分复制到列表中的快速方法

本文关键字:列表 方法 数组 一部分 复制 | 更新日期: 2023-09-27 18:01:25

C#的列表<>具有一组CopyTo函数,这些函数将使用快速内存块复制将其内部数组的内容提取到另一个数组中。

有没有相反的方法?它可能看起来像。。。

var buffer = new List<byte>();
buffer.AddRange(afewbytes);
buffer.AddFromArray(myArray, startIndex, countBytesToCopy);
buffer.AddRange(afewmorebytes);

由于我的列表是列表<字节>多样性,我更喜欢避免一个逐字节复制的循环。

将数组的一部分复制到列表中的快速方法

如果集合实现ICollection<T>List<T>(IEnumerable<T>)构造函数将使用ICollection<T>.CopyTo,而byte[]将执行此操作。

如果您只想提取数组的部分,那么这不会直接有帮助,但您可以创建自己的实现ICollection<byte>ByteArraySegment类,并使用Buffer.BlockCopy或其他任何东西来实现CopyTo操作:

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));

(或者使用具有相同优化的AddRange。(

要复制数组的一部分,请将数组包装在ArraySegment中,指定段的索引和计数。使用列表的AddRange方法将ArraySegment添加到列表中。AddRange将使用ArraySegment.CopyTo,后者使用Array.Copy,后者速度快。

List.AddRange(myArray)应该非常高效。

来自MSDN:"如果新的Count(当前Count加上集合的大小(将大于Capacity,则通过自动重新分配内部数组以容纳新元素来增加List的容量,并且在添加新元素之前将现有元素复制到新数组中。">