我得到了我的程序的提示,使用类结构而不是大量的数组和矩阵,更容易阅读和维护。 (我在这里找不到类似的主题,但也许我使用了错误的词汇。但是我希望得到帮助)
由于我有一个包含多个条目的数据集,我不想拥有所有这些条目,而是一些特定的条目。所以我构建了一个类来存储它们更容易:
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的所有值都会更改为实际值。
我不知道我在哪里做错了一步,并希望你能帮助我防止这种压倒一切。
答案 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;
}