C# 循环后所有元素都相同
我想给数组的元素赋值。运行此操作后,ListResults的所有元素都与ListROI的最后一个元素相同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 = 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对象,因此值相同