IList.Add() 覆盖现有数据
本文关键字:数据 覆盖 Add IList | 更新日期: 2023-09-27 18:33:39
我在向IList
中添加数据时遇到问题,但问题是每次添加数据时,现有数据都会被当前数据覆盖,我的代码如下:
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);
}
这背后的原因是什么?
在循环内移动测试对象的创建
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
时刻,并一次又一次地添加相同的内容。
您需要将
Test 对象的创建移动到循环内部。原因是对象new Test()
只实例化一次,并且对同一对象的引用不断添加到循环中的列表中。
因为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);
}
由于您不会在 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);
}
您一直在使用相同的引用变量(测试)。尝试在循环中创建新的 Test()。
您正在创建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)