如何防止在for循环中覆盖数组条目?

时间:2017-11-09 09:44:08

标签: c# arrays class for-loop

我得到了我的程序的提示,使用类结构而不是大量的数组和矩阵,更容易阅读和维护。 (我在这里找不到类似的主题,但也许我使用了错误的词汇。但是我希望得到帮助)

由于我有一个包含多个条目的数据集,我不想拥有所有这些条目,而是一些特定的条目。所以我构建了一个类来存储它们更容易:

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()
    {

    }
}

调用和填充它们不是问题,但我有超过100个ControlPoint个对象,所以我想使用for循环来填充它们并将它们存储在一个新的数组/列表/ 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的所有值都会更改为实际值。

我不知道我在哪里做错了一步,并希望你能帮助我防止这种压倒一切。

2 个答案:

答案 0 :(得分:3)

您只需创建一个ControlPoint实例并反复修改它,然后将其分配给数组的每个元素。在循环中移动实例化:

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 :(得分:1)

您正在为DataPoints数组中的每个元素分配相同的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;
}