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
相关产品推荐
相关产品推荐

