将数组的一部分复制到List中的快速方法?

时间:2014-05-01 17:31:36

标签: c# .net arrays performance memory

C#的列表<>有一组CopyTo函数,它们使用快速内存​​块副本将其内部数组的内容提取到另一个数组中。

有没有办法反过来做到这一点?它可能看起来像......

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

由于我的List是List&lt; byte&gt;我希望避免使用逐字节复制的循环。

3 个答案:

答案 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