2012-04-01 30 views
0

我有兩個方法,QuickSort()和ReverseArray()的類。當我傳入數組時,它將首先調用QuickSort(),然後調用ReverseArray(),但是當它到達ReverseArray()時,它將從QuickSort()中反轉已排序的數組,而不是反轉所創建的原始數組。我究竟做錯了什麼?任何意見將不勝感激。具有多種排序方法

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

    } 

回答

4

數組是一種參考類型。您正在研究整個代碼庫中的相同的參考。

如果你想要一個拷貝的數組,你需要複製它。

這裏,newarray不是陣列的拷貝,但參考的副本ProgramArray

newarray = ProgramArray; 

使用以便創建副本上Array定義的Copy方法:

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

此外,我建議閱讀有關value types and reference types之間的差異。

+0

Thx..I'm居然不好意思,我從來沒有新的是,我比較熟悉C#,我永遠不要使用數組,我通常用列表。感謝幫助。 – TMan 2012-04-01 19:15:11

+0

列表和所有其他集合類型都是相同的。 .NET Framework庫中的絕大多數類型都是引用類型。 – 2012-04-01 19:33:06

1

在.NET中,數組是引用類型。在QuickSort中,「newarray = ProgramArray」行將newArray引用設置爲與ProgramArray相同的實例。所以Array.Sort實際上是在ProgramArray上運行的。同樣,在ReverseArray中,Array.Reverse也在ProgramArray上運行。如果您想複製數組,請使用Clone()。

1

數組是對象引用類型,因此語句newarray = ProgramArray;會導致newArray引用與ProgramArray相同的數組。爲了避免這種情況,你必須複製數組。

1

請嘗試下面的代碼。將一個數組分配給另一個數組時,您不是克隆或應對所有元素。您正在分配數組的開始部分的內存地址。換句話說,你只是將一個引用變量賦值給另一個數組。 I.E.所有的數組變量指向相同的地址空間,因此即使您使用不同的變量名稱,也要修改相同的數組。

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

除了什麼別人告訴你引用類型,我建議你通過,而不是使用全局陣列ProgramArray進行排序作爲參數傳遞給排序方法的陣列。這使得更容易理解信息流。

public void QuickSort(int[] array) 
{ 
    // Easiest way to get a copy of the array 
    var newArray = (int[])array.Clone(); 
    ... 
} 

public void ReverseArray(int[] array) 
{ 
    var newArray = (int[])array.Clone(); 
    ... 
} 

public Program(int[] array) 
{  
    QuickSort(array); 
    ReverseArray(array); 
} 
+0

是的,我開始時實際上是這樣的,但是改變它以爲我在複製數組時做了一些錯誤的事情(我當然明白),但是我將它改回到了這個,你的權利更加清晰。謝謝。 – TMan 2012-04-01 19:27:09