我想为数组的元素赋值。运行此命令后,ListResults的所有元素都与ListROI的最后一个元素相同。
ListResults = new DataPoint[nROIrow];
DataPoint TempRes = new DataPoint();
System.Collections.ArrayList List = new System.Collections.ArrayList();
for (int i = 0; i < nROIrow; i++)
{
TempRes.X = ListROI[i].X;
TempRes.Y = ListROI[i].Y;
TempRes.u = dispROIcorr[i, 0];
TempRes.v = dispROIcorr[i, 1];
ListResults[i] = TempRes;
disp.Xpix = ListResults[i].X;
disp.Ypix = ListResults[i].Y;
disp.X = ListResults[i].X;
disp.Y = ListResults[i].Y;
disp.U = ListResults[i].u;
disp.V = ListResults[i].v;
List.Add(disp);
bSAVE.Enabled = true;
}
答案 0 :(得分:3)
您只能创建一次new DataPoint();
。所以你最终会得到一个充满对同一单个实例的引用的数组。
简单的修复:
ListResults = new DataPoint[nROIrow];
//DataPoint TempRes = new DataPoint();
System.Collections.ArrayList List = new System.Collections.ArrayList();
for (int i = 0; i < nROIrow; i++)
{
DataPoint TempRes = new DataPoint();
...
ListResults[i] = TempRes;
var disp = new ...
disp.Xpix = ListResults[i].X;
....
List.Add(disp);
}
答案 1 :(得分:3)
您的代码存在的问题是您正在重复使用TempRes
变量。当你执行&#34; List.Add&#34;你只是添加一个引用,所有这些引用(显然)是相同的。您也可以对其进行修改,因此每个相同的参考逻辑上都指向相同的相同数据。
相反,写一下:
System.Collections.ArrayList List = new System.Collections.ArrayList();
for (int i = 0; i < nROIrow; i++)
{
DataPoint TempRes = new DataPoint();
...
另请注意,自.NET 2.0起,ArrayList
通常被认为已弃用,您应该使用List<T>
。
答案 2 :(得分:0)
DO
disp = new ... // whatever
在将值分配给disp[i].???
实际上发生的事情是List
中的所有引用都指的是disp
,它是在for循环外创建的单个对象,因此List
中的所有项都指向到相同的disp
对象,因此值相同。