循环后所有元素相同

本文关键字:元素 循环 | 更新日期: 2023-09-27 18:06:53

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

循环后所有元素相同

只能创建一个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);
}  

代码的问题是您正在重用TempRes变量。当您执行"列表"时。你只是给它添加了一个引用,所有这些引用(显然)都是一样的。您还可以修改它,使每个相同的引用在逻辑上指向相同的数据。

相反,写:

System.Collections.ArrayList List = new System.Collections.ArrayList();
for (int i = 0; i < nROIrow; i++)
   {
     DataPoint TempRes = new DataPoint();
     ...

还请注意,ArrayList通常被认为自。net 2.0以来已弃用,您应该使用List<T>

do

disp = new ... // whatever

赋值给disp[i].???

实际上正在发生的事情是你的List中的所有引用都指向disp,这是在for循环之外创建的单个对象,因此List中的所有项目都指向相同的disp对象,因此相同的值。