2010-04-07 65 views
6

为什么不把元素被换基本的C#问题

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修饰符的数组不会更改。 引用的副本是作为参数传递的吗?

+1

请问您是否可以更改您的问题以使其更具描述性? '基本的C#问题'有我的-1。 – 2010-04-07 09:01:49

回答

21

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

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

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

这是问题的正确答案。另外需要注意的是,如果数组是方形的,这只会“工作”。如果我!= j,那么它会尝试分配给不存在的数组部分。 – cjk 2010-04-07 07:44:58

+0

基本问题是在你的循环中没有在C#ref和value类型传递参数中,改变你的算法,如Jens A所提到的,并且看到这是输出。 – 2010-04-07 07:47:47

1

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

数组通过引用传递。

SwapArray(ref int[,] arr) 

在这里,您通过引用传递引用(对不起,同义反复),这意味着,你甚至可以重新分配一个参考:

arr = new int [10,20]; 
4

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

+0

不,行'arr [i,j] = arr [j,i];'an'int'是按值复制的。但是你在下一句话中发现了真正的问题。 (+1) – 2010-04-07 07:44:08

1

试试这个。

我改变了第二个循环。 我真的交换和再次调用。所以你站在你身边。

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; 
      } 
     } 
    } 
+0

Nitpicking:内循环应该从i + 1开始,而不是i。如果i == j,交换arr [i,j]和arr [j,i]有什么意义呢? – Niki 2010-04-07 08:10:17

+0

正确我为i!= j添加了一张支票。但是你说的是对的。现在改变了。谢谢你!!!! – 2010-04-07 08:15:03