2016-07-12 3 views
0

私は問題に遭遇しました。私はギザギザの配列(入力)を作成し、次にいくつかの関数を実行し、それから別のギザギザの配列を作成することを期待しています(出力)。しかし、何とか元のアレイもそのプロセスで変更されました。 元の配列の変更を避けるにはどうすればよいですか?c#ギザギザの配列自体が変更されます

double[][] input; 
    double[][] output; 
    private void button1_Click(object sender, EventArgs e) 
    { 
     input = new double[][] 
     { 
      new double[] {0,1,2,3 }, 
      new double[] {9,8 }, 
      new double[] {14,5,0 }, 
      new double[] {2.0,2.3,2.5 } 
     }; 
     output = function(input); 
    } 
    static double[][] function (double[][] ins) 
    { 
     double[][] ous = ins; 
     int leng = ins.GetLength(0); 
     for (int i = 0; i < leng; i++) 
     { 
      int lung = ins[i].GetLength(0); 
      for (int j = 0; j < lung; j++) 
       ous[i][j] += 14.4; 
     } 
     return ous; 
    } 
+0

をここでの問題 'ダブル[] []のOU =インです;' –

+0

@AlekseyL。両方の配列のサイズが同じであるため、これを追加しました。そのため、再度宣言する必要はありませんでした。しかし、問題はその "入力"配列の変更です。 – Leinad

+0

Alekseyは指摘したように、基本的には値をコピーせずに参照を割り当てています。したがって、メモリには構造体が1つしかなく、ポインタが2つしかありません。だからそれが変わるのです。 – 3615

答えて

1

問題は、ins(参照)と同じ配列にous可変ポイント。新しい配列にコピーする必要があります。

static T[][] CopyArray<T>(T[][] source) 
{ 
    return source.Select(s => s.ToArray()).ToArray(); 
} 

そして、それを使用します:LINQ使ったとえば

double[][] ous = CopyArray(ins); 
+0

ありがとうございます。私はそれを得ていませんが、今はうまくいきます。 私の元のコードでは、基本的には同じ4つの配列を両方のギザギザの配列に割り当てていましたが、2番目のarrrayの中でそれらを変更したときに、最初のものも変更されました。 – Leinad

+0

より具体的には、両方の変数を同じギザギザの配列に割り当てました。 –

関連する問題