2012-04-01 60 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

相关问题