2013-10-03 48 views
5

我面對將數據添加到一個IList的問題,但問題是每次我加數據覆蓋現有數據與當前一個下面我的代碼中給出:IList.Add()覆蓋現有數據

Test test = new Test(); 
IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 

背後的原因是什麼?

+0

http://msdn.microsoft.com/en-us/library/490f96s2。aspx –

+2

您遇到的問題是因爲該測試是引用類型而不是值類型,當您將測試添加到列表時,您正在添加指向內存測試的指針,然後運行下一個循環時,您將進行更改該內存空間覆蓋前一個循環的數據,因此你需要使用循環內的New statment來爲該循環分配一個新的內存空間來使用 – MikeT

+0

感謝所有感謝指出我的錯誤:) – Optimus

回答

11

移動測試對象的循環

IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ Test test =new Test(); 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 

你現在做的是更新的test同一時刻內循環,再而添加相同的內部創造..

4

你需要移動的創建Test對象到循環內部。原因是對象new Test()僅實例化一次,並且對同一對象的引用不斷添加到循環中的列表中。

3

因爲Test test正在複製引用。你需要在循環中移動它。

做這樣的

IList<Test> myList = new List<Test>(); 
foreach (DataRow dataRow in dataTable.Rows) 
{ 
    Test test =new Test(); 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 
2

因爲你沒有創建foreach循環新實例,更正代碼:

Test test = null; 
IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ 
    test = new Test(); 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 
2

您使用的是相同的參考變量(測試)的所有時間。嘗試在循環中創建新的Test()。

1

您正在創建的Test

Test test = new Test(); // This is your instance 
IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ 
    // Here you change the values of the existing instance each time you loop 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); // but you are still just adding the same reference to the list multiple times 
} 

一個實例,然後因爲你永遠不會創建一個新的Test實例,你多次添加相同的參考名單。這意味着您基本上只是一遍又一遍地存儲同一個對象:如果您對列表中的一個項目進行任何更改,它將立即在所有其他項目中可見,因爲它們本質上是相同的對象

解決方案是移動測試循環中的實例

IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ 
    Test test = new Test(); // Each loop iteration will now create a new instance of Test 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 

如果您需要了解這更好,看看.NET參考和值類型和引用/值傳遞

價值和文獻類型.NET: http://msdn.microsoft.com/en-us/library/t63sy5hs.aspx

有關維基百科上指針的一些信息 http://en.wikipedia.org/wiki/Pointer_(computer_programming)