5

我在向 an 添加数据时遇到问题,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);
}

这背后的原因是什么?

4

6 回答 6

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循环内的同一时刻并一次又一次地添加相同的时刻..

于 2013-10-03T10:19:44.153 回答
4

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

于 2013-10-03T10:19:50.590 回答
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);
}
于 2013-10-03T10:20:03.533 回答
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);
}
于 2013-10-03T10:20:49.430 回答
2

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

于 2013-10-03T10:20:54.217 回答
2

您正在创建一个实例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实例,因此您将多次向列表添加相同的引用。这意味着您本质上只是一遍又一遍地存储相同的对象:如果您对列表中的一项进行任何更改,它将立即在所有其他项目中可见,因为它们本质上是相同的对象

解决方案是将 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)

于 2013-10-03T10:23:12.033 回答