C#中如何使用Array.Copy()复制数组并反转指定部分元素?
需求背景
需要将长度为8的SourceArray元素拆分复制到两个长度为4的独立数组,预期输出:
DestArray1存储SourceArray前4个元素,顺序反转,结果为[4,3,2,1]DestArray2存储SourceArray后4个元素,保持原顺序,结果为[5,6,7,8]
原有手写for循环可正常实现需求,尝试替换为Array.Copy()方法时运行结果不符合预期:
- 错误尝试代码:
Array.Copy(SourceArray, 0, DestArray1, 3, 0); Array.Copy(SourceArray, 4, DestArray2, 0, 3);
- 实际运行结果:
DestArray1:[0,0,0,0]DestArray2:[5,6,7,0]
问题根因
代码存在两个核心问题:
- 参数传值错误:
Array.Copy的参数签名为Array.Copy(源数组, 源起始索引, 目标数组, 目标起始索引, 复制元素长度),第一行代码最后一个长度参数传了0,等于没有复制任何元素,所以DestArray1全是字节默认值0;第二行长度参数传了3,只复制了3个元素,所以DestArray2最后一位保留默认值0。 - 能力边界问题:
Array.Copy本身只支持按源数组的原有正序批量复制,不支持反转顺序复制,没法直接实现前4个元素倒序写入的需求。
正确实现方案
DestArray2是顺序复制后4个元素,直接用Array.Copy即可,只需要把长度参数修正为4:
// 从SourceArray索引4开始,复制4个元素到DestArray2的起始位置 Array.Copy(SourceArray, 4, DestArray2, 0, 4);
DestArray1需要反转前4个元素,最高效的实现是先正序复制前4个元素,再调用内置的Array.Reverse()做原地反转,性能优于手写for循环:
// 先正序复制前4个元素 Array.Copy(SourceArray, 0, DestArray1, 0, 4); // 原地反转得到倒序结果 Array.Reverse(DestArray1);
完整可运行代码如下:
int bytelength = 8; int halfbytelength = 4; byte[] SourceArray = new byte[]{ 1, 2, 3, 4, 5, 6, 7, 8 }; byte[] DestArray1 = new byte[4]; byte[] DestArray2 = new byte[4]; // 处理DestArray2:复制后4个正序元素 Array.Copy(SourceArray, halfbytelength, DestArray2, 0, halfbytelength); // 处理DestArray1:复制前4个元素后反转 Array.Copy(SourceArray, 0, DestArray1, 0, halfbytelength); Array.Reverse(DestArray1);
运行结果完全符合预期:
DestArray1值为[4,3,2,1]DestArray2值为[5,6,7,8]
如果不想引入Array.Reverse(),保留原有手写for循环实现反转复制的逻辑也完全可用,没有性能问题。
内容的提问来源于stack exchange,提问作者Lha
相关产品推荐
相关产品推荐

