2010-04-07 17 views
6

¿por qué el elemento swapeadabásica C# pregunta

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

incluso si el parámetro es sin modificador ref la matriz no cambia. una copia de la referencia se pasa como parámetro ¿verdad?

+1

¿Podría cambiar su pregunta para que sea un poco más descriptiva, por favor? 'Pregunta básica de C#' obtuvo mi -1. –

Respuesta

21

Hay un error en el algoritmo. Para cada i y j, su bucle intercambia arr[i,j] y arr[j,i] dos veces.

Por ejemplo arr[3,1] se intercambia con arr[1,3] una vez para i = 3, j = 1 y una vez para i = 1, j = 3. Entonces el resultado es la matriz original. Debe cambiar el j-loop a

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

Esta es la respuesta correcta a la pregunta. Otra cosa a tener en cuenta es que esto solo "funcionará" si la matriz es cuadrada. Si i = j, intentará asignar partes de la matriz que no existen. – cjk

+0

El problema básico está en su bucle no en el parámetro C# ref y el tipo de valor pasado, cambie su algo como lo menciona Jens A, y vea que ese es el resultado. –

1

una copia de la referencia se pasa como parámetro ¿no?

Las matrices se pasan por referencia.

SwapArray(ref int[,] arr) 

Aquí están pasando una referencia por referencia (lo siento, por tautología), esto quiere decir, que incluso se puede volver a asignar una referencia:

arr = new int [10,20]; 
4

El segundo arr.GetLength(0) debe ser arr.GetLength(1). Porque quieres usar la 2da dimensión.

+0

No, en la línea 'arr [i, j] = arr [j, i];' an 'int' se copia por valor. Pero descubrió el problema real en la siguiente oración. (+1) –

1

intente esto.

He cambiado el segundo ciclo for. u en realidad intercambiando y volviendo a pintar nuevamente. entonces te quedas donde estabas.

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: El ciclo interno debería comenzar en i + 1, no en i. ¿Para qué sirve intercambiar arr [i, j] y arr [j, i] si i == j? – Niki

+0

correcto, agregué un cheque para i! = J. Pero lo que dices es correcto. Cambió ahora. ¡¡¡¡Gracias!!!! –