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

C#中不使用Array.Reverse反转数组的最简方法?代码输出异常求解答

在C#中不使用Array.Reverse反转数组的正确方式

你遇到的问题很常见——先看看你写的代码:

我尝试了以下代码,输出结果为5 4 3 4 5,而非预期的5 4 3 2 1:

for (int i = 0; i < numbers.Length;i=i+1) { 
    int tmp = numbers[i]; 
    numbers[i] = numbers[numbers.Length - i - 1 ]; 
    numbers[numbers.Length - i - 1 ] = tmp; 
    Console.WriteLine(numbers[i]);
}

问题出在循环的范围上:你遍历了整个数组的长度,这导致前半部分交换好的元素,在后半段循环时又被换回去了。比如当i=3时,你其实是在交换已经被处理过的索引1的元素,把之前交换好的4和2又换了回来,最后输出自然就乱了。

最简单的修复方案

只需要把循环终止条件改成遍历数组的前一半,这样每个元素只会被交换一次:

int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.Length / 2; i++)
{
    // 交换当前元素与对应位置的末尾元素
    int tmp = numbers[i];
    numbers[i] = numbers[numbers.Length - i - 1];
    numbers[numbers.Length - i - 1] = tmp;
}

// 验证输出
foreach (int num in numbers)
{
    Console.Write(num + " ");
}
// 输出结果:5 4 3 2 1

为什么这能解决问题?

假设数组长度为n,我们只需要配对交换第i个元素和第n-1-i个元素,直到处理到数组中间位置:

  • 如果数组长度是奇数(比如5),中间的元素不需要交换(交换自己不影响结果);
  • 如果是偶数(比如4),刚好完成所有配对元素的交换,不会重复操作。

如果你想要更简洁的写法(不修改原数组的情况),可以用LINQ的Reverse()扩展方法(注意这不是Array.Reverse()静态方法):

int[] numbers = {1, 2, 3, 4, 5};
int[] reversedNumbers = numbers.Reverse().ToArray();

foreach (int num in reversedNumbers)
{
    Console.Write(num + " ");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:39:34