C# 循环后所有元素都相同

C# 循环后所有元素都相同,c#,arrays,element,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

我想给数组的元素赋值。运行此操作后,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;  
}
您只创建一个新的数据点;一次。因此,最终将得到一个数组,其中包含对同一个实例的全部引用

简单的解决方案:

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);
}  
您只创建一个新的数据点;一次。因此,最终将得到一个数组,其中包含对同一个实例的全部引用

简单的解决方案:

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变量。当您执行List.Add时,您只是向它添加了一个引用,所有这些引用显然是相同的。您还可以修改它,使每个相同的引用在逻辑上指向相同的数据

相反,写下:

System.Collections.ArrayList List = new System.Collections.ArrayList();

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

另外请注意,自.NET 2.0以来,ArrayList通常被认为是不推荐使用的,您应该改用List。

代码的问题在于您正在重用TempRes变量。当您执行List.Add时,您只是向它添加了一个引用,所有这些引用显然是相同的。您还可以修改它,使每个相同的引用在逻辑上指向相同的数据

相反,写下:

System.Collections.ArrayList List = new System.Collections.ArrayList();

for (int i = 0; i < nROIrow; i++)
   {
     DataPoint TempRes = new DataPoint();
     ...
另外请注意,自.NET 2.0以来,ArrayList通常被认为是不推荐使用的,您应该改用List

disp = new ... // whatever
在将值分配给disp[i]之前

实际上,列表中的所有引用都指向disp,而disp是在for循环之外创建的单个对象,因此列表中的所有项都指向同一disp对象,因此值相同。

disp = new ... // whatever
在将值分配给disp[i]之前

实际上,列表中的所有引用都引用了disp,而disp是在for循环外部创建的单个对象,因此列表中的所有项都指向同一disp对象,因此值相同