基本的c#问题

时间:2010-04-07 07:33:41

标签: c# .net

为什么元素不会被交换

public static void SwapArray(int[,] arr)
    {
        for (int i = 0; i < arr.GetLength(0); i++)
        {
            for (int j = 0; j < arr.GetLength(0); j++)
            {
                int temp = arr[i, j];
                arr[i, j] = arr[j, i];
                arr[j, i] = temp;
            }
        }
    }

即使参数没有ref修饰符,数组也不会改变。 引用的副本作为参数传递给对象?

4 个答案:

答案 0 :(得分:21)

您的算法存在错误。对于每个i和j,您的循环会交换arr[i,j]arr[j,i]两次。

例如,对于i = 3,j = 1,arr[3,1]arr[1,3]交换一次,对于i = 1,j = 3。结果是原始矩阵。您应该将j循环更改为

for (int j = 0; j < i; j++) 

答案 1 :(得分:4)

第二个arr.GetLength(0)应为arr.GetLength(1)。因为你想使用第二维。

答案 2 :(得分:1)

  

引用的副本是作为参数传递的吗?

通过引用传递数组。

SwapArray(ref int[,] arr)

在这里,您通过引用传递引用(对不起,对于重言式),这意味着您甚至可以重新分配引用:

arr = new int [10,20];

答案 3 :(得分:1)

试试这个。

我已经更改了第二个for循环。 你实际上交换并再次重新开始。所以,你站在原地。

public static void SwapArray(int[,] arr) 
    { 
        for (int i = 0; i < arr.GetLength(0); i++) 
        { 
            for (int j = i+1; j < arr.GetLength(0); j++) 
            { 
                  int temp = arr[i, j]; 
                  arr[i, j] = arr[j, i]; 
                  arr[j, i] = temp; 
             } 
        } 
    }