You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:48:22