2014-06-05 143 views
1

我想爲我的數組元素賦值。運行這個之後,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

您只需創建一個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); 
} 
3

與您的代碼的問題是,你是重用TempRes變量。當您執行「List.Add」時,您只需添加對其的引用,並且所有這些引用(顯然)都是相同的。您也可以修改它,因此每個相同的參考在邏輯上指向相同的相同數據。

你應該寫:

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>代替。

0

disp = new ... // whatever 

disp[i].???

實際分配值之前所發生的事情是所有在你的List指的disp這是被外界所創建的for循環的單個對象的引用,因此List中的所有項都指向相同的disp對象,因此具有相同的值。

相關問題