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

如何在同一数组中交换两组不同长度的元素?(C#实现需求)

同一数组中交换不同长度元素的C#实现方案

核心思路(理论步骤)

要交换数组中两组不重叠、长度不同的元素,可通过块重组的方式实现,步骤如下:

  1. 参数标准化:确保第一组的起始索引小于第二组的起始索引(若反之,直接交换两组的起始索引和长度,统一处理逻辑)。
  2. 合法性校验:验证两组索引不越界、且无重叠(第一组的结束索引+1 ≤ 第二组的起始索引)。
  3. 提取连续块:将包含第一组、两组间中间元素、第二组的连续区域复制到临时数组。
  4. 重组临时块:把临时数组的结构从「第一组→中间元素→第二组」调整为「第二组→中间元素→第一组」。
  5. 回写原数组:将重组后的临时数组复制回原数组的对应位置。

这种方式利用Array.Copy(底层优化的内存复制操作)实现,兼顾简洁性与执行效率,属于轻量化方案。

C# 实现代码

以下是通用泛型方法,支持任意类型数组:

public static void SwapGroups<T>(T[] arr, int start1, int length1, int start2, int length2)
{
    // 标准化参数:确保start1 < start2,简化后续逻辑
    if (start1 > start2)
    {
        (start1, start2) = (start2, start1);
        (length1, length2) = (length2, length1);
    }

    // 参数合法性校验
    if (arr == null) throw new ArgumentNullException(nameof(arr));
    if (start1 < 0 || start1 + length1 > arr.Length) throw new ArgumentOutOfRangeException(nameof(start1));
    if (start2 < 0 || start2 + length2 > arr.Length) throw new ArgumentOutOfRangeException(nameof(start2));
    if (start1 + length1 > start2) throw new ArgumentException("两组元素不能重叠");

    // 计算连续块的起始和总长度
    int blockStart = start1;
    int blockTotalLength = start2 + length2 - start1;
    int midLength = start2 - (start1 + length1);

    // 提取连续块到临时数组
    T[] tempBlock = new T[blockTotalLength];
    Array.Copy(arr, blockStart, tempBlock, 0, blockTotalLength);

    // 重组临时块:第二组→中间元素→第一组
    T[] resultBlock = new T[blockTotalLength];
    // 复制第二组到结果块开头
    Array.Copy(tempBlock, length1 + midLength, resultBlock, 0, length2);
    // 复制中间元素到结果块中间
    Array.Copy(tempBlock, length1, resultBlock, length2, midLength);
    // 复制第一组到结果块末尾
    Array.Copy(tempBlock, 0, resultBlock, length2 + midLength, length1);

    // 回写原数组
    Array.Copy(resultBlock, 0, arr, blockStart, blockTotalLength);
}

示例验证

针对你给出的示例场景:

string[] lines = {
    "line 0", "line 1", "line 2", "line 3",
    "line 4", "line 5", "line 6", "line 7", "line 8"
};
// 交换第1-3行(起始索引1,长度3)与第5-6行(起始索引5,长度2)
SwapGroups(lines, 1, 3, 5, 2);

// 输出结果:
// line 0
// line 5
// line 6
// line 4
// line 1
// line 2
// line 3
// line 7
// line 8

优化说明

如果追求极致的内存效率,也可以避免创建resultBlock,直接在tempBlock上进行原地重组,但代码复杂度会提升。上述实现以可读性+轻量化为优先,Array.Copy的性能足够应对绝大多数场景。

内容的提问来源于stack exchange,提问作者Ill Magnus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:40:00