You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何自定义C#数组反转方法无法正常工作?请排查原因

问题分析与解决方案

嘿,我来帮你搞清楚为什么你的数组反转方法没按预期工作!

核心问题:数组的引用类型特性

你这里踩了一个很容易忽略的坑——数组是引用类型。当你写int[] arr = array;的时候,并没有创建一个新的数组副本,只是让arrarray指向了内存中的同一个数组对象。也就是说,你修改array的同时,arr的内容也会跟着变,因为它们本质上就是同一个东西!

你的代码执行过程拆解

拿你测试的数组{1,2,3,4,5,6}一步步拆解:

  1. 第一个for循环(i从0到2):
    • i=0:array[0] = array[5] → array变成{6,2,3,4,5,6},此时arr也同步变成这个值(因为引用同一个数组)
    • i=1:array[1] = array[4] → array变成{6,5,3,4,5,6}arr同样更新
    • i=2:array[2] = array[3] → array变成{6,5,4,4,5,6}arr还是和array完全一致
  2. 第二个for循环(i从5到3):
    • i=5时,你想让array[5] = arr[0],但此时arr[0]已经是6(第一个循环修改了原数组,arr跟着变了),所以array[5]还是6,根本不是你期待的原数组的1!

修复方案

首先要做的是创建原数组的真实副本,而不是简单的引用赋值。另外,反转数组其实不需要两个循环,一个循环交换两端的元素就足够简洁高效。

修复后的代码

// ReverseArray方法
static int [] ReverseArray(int [] array) {
    // 创建原数组的独立副本,避免引用同步修改
    int[] arr = (int[])array.Clone();
    
    // 简化逻辑:单循环交换两端元素
    for (int i=0; i<array.Length/2;i++) {
        int temp = array[i];
        array[i] = array[array.Length - 1 - i];
        array[array.Length - 1 - i] = temp;
    }
    
    return array;
}

// Method for displaying elements of Array
static void DisplayArray(int [] array) {
    int i;
    Console.Write("{");
    for (i = 0; i < array.Length-1; i++) {
        Console.Write(array[i] + ",");
    }
    Console.WriteLine(array[i] + "}");
}

static void Main(string[] args) {
    int[] array = { 1, 2, 3, 4, 5 ,6};
    ReverseArray(array);
    DisplayArray(array); // 现在会输出{6,5,4,3,2,1}
    Console.ReadKey();
}

关键修改点

  1. (int[])array.Clone()创建原数组的独立副本,这样arr就和原数组完全分离(对于int这类值类型数组,Clone足够满足需求)。
  2. 简化反转逻辑:一个循环内交换当前索引和对应末尾索引的元素,既高效又避免了多循环带来的错误。

额外小提示

如果你不想修改传入的原数组(希望原数组保持不变,返回一个新的反转数组),可以直接操作副本arr,然后返回arr,这样Main方法里的原数组依然是{1,2,3,4,5,6},反转后的结果是全新的数组对象。

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

火山引擎 最新活动