循环后所有元素相同

时间:2014-06-05 21:27:36

标签: c# arrays element

我想为数组的元素赋值。运行此命令后,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;  
}

3 个答案:

答案 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对象,因此值相同。