我有一个名为粒子的对象,它有自己的属性(位置、速度等),在我的窗口窗体中,我创建了一个粒子列表。然后在代码中更新这个粒子列表(即在每个迭代步骤中更新每个粒子的位置、速度等)。
我想要做的是在每次迭代(单击按钮后)将其添加List<Particle>
到另一个列表中List<List<Particle>>
,这样我现在就有了可以比较的单独的粒子列表。
这就是我的代码的样子(UpdateEngine 是一个类,它在其初始化方法中创建一个粒子列表,然后具有更新其列表中粒子值的其他方法):
public partial class frmMain : Form
{
private List<List<Particle>> listPlist;
private UpdateEngine Engine;
...
public frmMain()
{
InitializeComponent();
listPlist = new List<List<Particle>>();
Engine = new UpdateEngine();
}
...
//pressing this button iterates through a specified number of iterations
private void btPrep_Click(object sender, EventArgs e)
{
//create the particles and add the first list to the list of lists
Engine.Initialize();
listPlist.Add(Engine.ParticleList);
//iterate through the list of particles in Engine and update their properties
for(i = 0; i <= iterations; i++)
{
Engine.Update();
listPlist.Add(Engine.ParticleList);
}
}
}
我看到发生的是第一个列表是在迭代之前添加的。在 for 循环中添加的第一个列表添加得很好。此后添加的每个列表都会将 listPlist 中的所有列表更改为与当前列表相同。
我在运行代码时看到的示例:
初始化后:
- listPlist(0) > Particle(0) > Position = 0,0
第一次迭代后:
- listPlist(0) > Particle(0) > Position = 0,0
- listPlist(1) > 粒子(0) > 位置 = 1,1
下一次迭代后:
- listPlist(0) > 粒子(0) > 位置 = 2,2
- listPlist(1) > 粒子(0) > 位置 = 2,2
- listPlist(2) > 粒子(0) > 位置 = 2,2
我不确定如何解决这个问题。有谁知道为什么会这样?