如何在同一数组中交换两组不同长度的元素?(C#实现需求)
同一数组中交换不同长度元素的C#实现方案
核心思路(理论步骤)
要交换数组中两组不重叠、长度不同的元素,可通过块重组的方式实现,步骤如下:
- 参数标准化:确保第一组的起始索引小于第二组的起始索引(若反之,直接交换两组的起始索引和长度,统一处理逻辑)。
- 合法性校验:验证两组索引不越界、且无重叠(第一组的结束索引+1 ≤ 第二组的起始索引)。
- 提取连续块:将包含第一组、两组间中间元素、第二组的连续区域复制到临时数组。
- 重组临时块:把临时数组的结构从「第一组→中间元素→第二组」调整为「第二组→中间元素→第一组」。
- 回写原数组:将重组后的临时数组复制回原数组的对应位置。
这种方式利用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
相关产品推荐
相关产品推荐

