2010-04-07 11 views
6

warum nicht das ElementGrund C# Frage

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

auch wenn der Parameter ohne ref Modifikator getauscht bekommen, ist das Array nicht ändert. eine Kopie der Referenz wird als Parameter richtig übergeben?

+1

Könnten Sie Ihre Frage etwas beschreibender bitte ändern? 'Basic C# Frage' hat meine -1 bekommen. –

Antwort

21

In Ihrem Algorithmus ist ein Fehler aufgetreten. Für jedes i und j tauscht Ihre Schleife zweimal arr[i,j] und arr[j,i].

Zum Beispiel wird arr[3,1] getauscht mit arr[1,3] einmal für i = 3, j = 1 und einmal für i = 1, j = 3. Das Ergebnis ist also die ursprüngliche Matrix. Sie sollten die J-Schleife zu

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

Dies ist die richtige Antwort auf die Frage. Eine andere Sache zu beachten ist, dass dies nur funktioniert, wenn das Array quadratisch ist. Wenn i! = J, dann versucht es, Teile des Arrays zuzuweisen, die nicht existieren. – cjk

+0

Grundlegendes Problem ist in Ihrer Schleife nicht in der C# ref und Wert übergebenen Parameter, ändern Sie Ihre Algo wie von Jens A erwähnt, und sehen, dass das die Ausgabe ist. –

1

eine Kopie der Referenz wird als Parameter richtig übergeben?

Arrays werden als Referenz übergeben.

SwapArray(ref int[,] arr) 

Hier werden Sie einen Verweis durch Verweis (sorry, für Tautologie) vorbei, bedeutet dies, dass Sie einen Verweis selbst zuweisen können:

arr = new int [10,20]; 
4

Der zweite arr.GetLength(0) sollte arr.GetLength(1) sein. Weil Sie die 2. Dimension verwenden möchten.

+0

Nein, in der Zeile 'arr [i, j] = arr [j, i];' wird ein 'int' nach Wert kopiert. Aber Sie haben das Problem im nächsten Satz entdeckt. (+1) –

1

versuchen, dies zu versuchen.

Ich habe die zweite für die Schleife geändert. Sie wechseln und wechseln erneut. Also stehst du wo du warst.

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: Die innere Schleife sollte bei i + 1 beginnen, nicht i. Was ist der Sinn des Tausches von arr [i, j] und arr [j, i] wenn i == j? – Niki

+0

richtig Ich habe einen Check für i! = J hinzugefügt. Aber was du sagst ist richtig. Habe es jetzt geändert. Danke!!!! –