2012-04-01 14 views
0

私は、QuickSort()とReverseArray()という2つのメソッドを持つクラスを持っています。配列を渡すと、最初に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の違いについて読んで示唆しています。 .NETで

+0

Thx..I'm実際に恥ずかしい私はC#の比較的よく知っている、ということは決して新しい、私は今までの配列を使用しないことを、私は通常のリストを使用しています。手伝ってくれてありがとう。 – TMan

+0

リストや他のすべてのコレクションタイプと同じです。 .NET Frameworkライブラリの大部分の型は参照型です。 –

1

、配列は参照型です。 QuickSortでは、 "newarray = ProgramArray"という行は、newArray参照をProgramArrayと同じインスタンスに設定します。したがって、Array.Sortは実際にはProgramArray上で動作しています。同様に、ReverseArrayでは、Array.ReverseもProgramArrayで動作しています。アレイをコピーする場合は、クローン()を使用します。

1

配列はオブジェクト参照型なので、newarray = ProgramArray;ステートメントはnewArrayProgramArrayと同じ配列を参照させます。これを避けるには、配列をコピーする必要があります。

1

代わりに次のコードを試してください。 1つの配列を別の配列に割り当てるときは、すべての要素を複製またはコピーしません。配列の先頭部分のメモリアドレスを割り当てています。つまり、参照変数を別の配列に代入するだけです。 I.すべての配列変数は同じアドレス空間を指しているため、異なる変数名を使用していても同じ配列を変更しています。他の人が参照型についてあなたが言ったことに加えて

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

関連する問題