2017-11-09 10 views
2

配列や行列の大量の代わりにクラス構造を使って読みやすく、保守しやすくするためのヒントを得ました。 (私はここで似たような話題は見つけられませんでしたが、間違った語彙を使用したかもしれませんが)助けを得たいとは思っていますがforループの配列エントリを無効にする方法は?

私は複数の項目を持つデータセットを持っているので、もの。だから私は簡単にそれらを格納するクラスを構築:

public class ControlPoint 
{ 
    // classify necessary variables 
    public double _collimatorangle; 
    public double _gantryangle; 
    public double[] _jawpositions = new double[4]; 
    public double _monitorunits; 
    public double[] _mlcs = new double[120]; 
    public double _beamenergy; 

    // construct the class 
    public ControlPoint() 
    { 

    } 
} 

呼び出し、それらを埋めるには問題ありませんが、私はそれらのControlPointオブジェクトの100の上に持っているので、私はそれらを記入し、それらを格納するためのループを使用していました新しい配列/リスト/ ArrayList最後に、差分を計算するためにデータを使用したいが、このクラスをdoubleに変換することはできません。だから私はこの

ControlPoint[] DataPoints = new ControlPoint[160]; 
ControlPoint CoPos = new ControlPoint(); 

for (int j = 0; j < 160; j++) 
{ 
    // reading data from file 
    // ... 
    CoPos._jawpositions[0] = Convert.ToDouble(ReadData_1); 
    CoPos._jawpositions[1] = Convert.ToDouble(ReadData_2); 
    CoPos._jawpositions[2] = Convert.ToDouble(ReadData_3); 
    CoPos._jawpositions[3] = Convert.ToDouble(ReadData_4); 

    DataPoints[j] = CoPos; 
} 

を書いたので、ループの後、私は、各配列のエントリに対して異なる値でDataPoints配列を期待しました。しかし、デバッグでは、データを変更することがわかりました。 j = 10にあるすべての値はDataPointsから0〜9に変更され、実際の値に変更されます。

私は間違ったステップをどこで行ったのかわかりません。あなたがそのオーバーライドを防ぐのを助けてくれることを願っています。

答えて

3

ControlPointのインスタンスを1つだけ作成し、それを何度も変更してから、配列のすべての要素に割り当てます。ループ内のインスタンスを移動:

for (int j = 0; j < 160; j++) 
{ 
    ControlPoint CoPos = new ControlPoint(); 

    // reading data from file 
    // ... 
    CoPos._jawpositions[0] = Convert.ToDouble(ReadData_1); 
    CoPos._jawpositions[1] = Convert.ToDouble(ReadData_2); 
    CoPos._jawpositions[2] = Convert.ToDouble(ReadData_3); 
    CoPos._jawpositions[3] = Convert.ToDouble(ReadData_4); 

    DataPoints[j] = CoPos; 
} 
1

あなたが唯一、すべてのループ上の値を変更し、同じCoPosは、あなたのデータポイントの配列内のすべての要素にオブジェクトを割り当てています。ループ内に新しいオブジェクトを作成します。

ControlPoint[] DataPoints = new ControlPoint[160]; 

for (int j = 0; j < 160; j++) 
{ 
    // reading data from file 
    // ... 
    var CoPos = new ControlPoint(); 

    CoPos._jawpositions[0] = Convert.ToDouble(ReadData_1); 
    CoPos._jawpositions[1] = Convert.ToDouble(ReadData_2); 
    CoPos._jawpositions[2] = Convert.ToDouble(ReadData_3); 
    CoPos._jawpositions[3] = Convert.ToDouble(ReadData_4); 

    DataPoints[j] = CoPos; 
} 
関連する問題