IList.Add()覆盖现有数据

我在向IList添加数据时遇到问题,但问题是每次添加数据时,现有数据都被当前数据覆盖,我的代码如下:

 Test test = new Test(); IList myList = new List(); 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); } 

这背后的原因是什么?

在循环内移动测试对象

 IList myList = new List(); 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瞬间,并一次又一次地添加相同的..

您需要将Test对象的创建移动到循环内部。 原因是对象new Test()仅实例化一次,并且对同一对象的引用不断添加到循环中的列表中。

因为Test test是通过引用复制的 。 你需要在循环中移动它。

像这样做

 IList myList = new List(); 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); } 

因为您没有在foreach循环中创建新实例,所以更正代码:

 Test test = null; IList myList = new List(); 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); } 

你一直在使用相同的参考变量(测试)。 尝试在循环中创建新的Test()。

您正在创建一个Test实例

 Test test = new Test(); // This is your instance IList myList = new List(); 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 myList = new List(); 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)