2012-04-01 15 views
0

Ich habe eine Klasse mit zwei Methoden, A QuickSort() und ReverseArray(). Wenn ich das Array übergebe, wird zuerst QuickSort() und dann ReverseArray() aufgerufen, wenn es jedoch zu ReverseArray() kommt, kehrt es das sortierte Array von QuickSort() um, anstatt das ursprüngliche Array umzukehren. Was mache ich falsch? Jeder Rat würde sehr geschätzt werden.Mehrere Sortiermethoden haben

public class Program 
    { 
    private readonly int[] ProgramArray = new int[10] ; 
    public Program(int[] array) 
    { 
     ProgramArray = array; 
     QuickSort(); 
     ReverseArray(); 
    } 

    public void QuickSort() 
    { 
     var newarray = new int[10]; 
     newarray = ProgramArray; 
     Array.Sort(newarray); 
     Print(newarray, "QuickSort"); 
    } 

    public void ReverseArray() 
    { 
     var newarray = new int[10]; 
     newarray = ProgramArray; 
     Array.Reverse(newarray); 
     Print(newarray, "Reversed"); 
    } 

    public static void Print(int[] array, string methodname) 
    { 
     int[] newarray = array; 
     Console.Write(string.Format("{0}: ", methodname)); 
     for (int i = 0; i < newarray.Length; i++) 
     { 
      Console.Write(newarray[i] + " "); 
     } 
     Console.Write("\n"); 
    } 

    static void Main(string[] args) 
    { 
     var array = new int[10] { 12, 24, 3, 44, 5, 16, 7, 34, 23, 34 }; 
     var program = new Program(array); 

    } 

Antwort

4

Ein Array ist eine Referenz Typ. Sie arbeiten an der gleichen Referenz in Ihrer Codebasis.

Wenn Sie eine Kopie des Arrays möchten, müssen Sie es kopieren.

Hierbei ist newarray keine Kopie des Arrays, aber eine Kopie der Referenz zu ProgramArray:

newarray = ProgramArray; 

Verwenden der Copy Methode auf Array definiert, um Kopien zu erstellen:

Array.Copy(ProgramArray, newarray, ProgramArray.Length); 

Ich schlage auch vor, über die Unterschiede zwischen value types and reference types zu lesen.

+0

Thx..ich bin eigentlich peinlich, dass ich das nie neu, ich bin relativ vertraut mit C#, ich benutze einfach nie Arrays, ich verwende normalerweise List. Danke für die Hilfe. – TMan

+0

Das gleiche gilt für Listen und alle anderen Sammlungsarten. Die meisten Typen in den .NET Framework-Bibliotheken sind Referenztypen. –

1

In .NET sind Arrays Referenztypen. In QuickSort setzt die Zeile "newarray = ProgramArray" die newArray-Referenz auf dieselbe Instanz wie ProgramArray. So arbeitet Array.Sort tatsächlich mit ProgramArray. Umgekehrt arbeitet Array.Reverse in ReverseArray auch mit ProgramArray. Wenn Sie das Array kopieren möchten, verwenden Sie Clone().

1

Ein Array ist ein Objektreferenztyp, daher bewirkt die Anweisung newarray = ProgramArray;, dass newArray dasselbe Array referenziert wie ProgramArray. Um dies zu vermeiden, müssen Sie das Array kopieren.

1

Versuchen Sie stattdessen den folgenden Code. Wenn Sie ein Array einem anderen Array zuweisen, klonen oder behandeln Sie nicht alle Elemente. Sie weisen die Speicheradresse des Anfangsteils des Arrays zu. Mit anderen Worten, Sie weisen einem anderen Array nur eine Referenzvariable zu. I.E. Alle Array-Variablen verweisen auf denselben Adressraum, und Sie ändern daher das gleiche Array, obwohl Sie unterschiedliche Variablennamen verwenden.

public class Program 
{ 
    private readonly int[] ProgramArray = new int[10]; 
    public Program(int[] array) 
    { 
     ProgramArray = array; 
     QuickSort(); 
     ReverseArray(); 
    } 

    public void QuickSort() 
    { 
     var newarray = new int[10]; 
     newarray = (int[])ProgramArray.Clone(); 
     Array.Sort(newarray); 
     Print(newarray, "QuickSort"); 
    } 

    public void ReverseArray() 
    { 
     var newarray = new int[10]; 
     newarray = (int[])ProgramArray.Clone(); 
     Array.Reverse(newarray); 
     Print(newarray, "Reversed"); 
    } 

    public static void Print(int[] array, string methodname) 
    { 
     int[] newarray = array; 
     Console.Write(string.Format("{0}: ", methodname)); 
     for (int i = 0; i < newarray.Length; i++) 
     { 
      Console.Write(newarray[i] + " "); 
     } 
     Console.Write("\n"); 
    } 

    static void Main(string[] args) 
    { 
     var array = new int[10] { 12, 24, 3, 44, 5, 16, 7, 34, 23, 34 }; 
     Print(array, "Original Array"); 
     var program = new Program(array); 
     Console.ReadKey(); 
    } 
} 
1

Zusätzlich zu dem, was die anderen gesagt, Sie Referenztypen, empfehle ich Ihnen das Array zu übergeben als Parameter an die Sortierverfahren sortiert werden, anstatt ProgramArray eine globale Array zu verwenden. Dies erleichtert das Verständnis des Informationsflusses.

+0

Ja, ich hatte es tatsächlich so, als ich anfing, aber ich änderte es, weil ich dachte, ich mache etwas falsch mit dem Kopieren des Arrays (was ich offensichtlich war), aber ich änderte es zurück, das ist sauberer. Vielen Dank. – TMan

Verwandte Themen