使用继承的定制对象的Arraylist

时间:2013-01-04 14:26:11

标签: c# arraylist

在我的应用程序中,我从数据库中检索3行数据,循环遍历数据行以将数据分配给我的客户对象,然后将客户添加到客户集合中:

// new customer object to fill in loop and assign to collection
tracker.Customer myCustomer = new tracker.Customer();

// new customer collection object to fill later
Tracker.customerCollection  myCustomerCollection = new trackerCustomerCollection();

foreach (System.Data.DataRow drRow in dsResults.Tables[0].Rows) 
{
  myCustomer.CustomerID = Item["CustomerID"];
  myCustomer.FKBandID = Convert.ToInt32(drRow["FKBandID"]);
  myCustomer.FKSectorID = Convert.ToInt32(drRow["FKSectorID"]); 
  myCustomer.CustomerName = Convert.ToString(drRow["CustomerName"]);
  myCustomer.CustomerAddress = Convert.ToString(drRow["CustomerAddress"]);
  myCustomer.CustomerPhoneNumber = Convert.ToString(drRow["CustomerPhoneNumber"]);

  myCustomerCollection.Add(myCustomer);
}

问题在于,当我尝试使用填充的myCustomerCollection时,集合中的3个Customer对象都是相同的。我遍历循环时myCustomer的每个实例都不同,但一旦添加到myCustomerCollection,它们就会发生变化。每个项目都与最后添加的项目相同。

如果有人能指出我正确的方向,我会非常感激,我在VB.NET中使用这个原则没有任何问题,但我现在被迫使用C#并且在查找源代码时遇到了麻烦我的问题。

2 个答案:

答案 0 :(得分:2)

这是因为您正在创建Customer对象的1个实例,并将其添加到列表中3次(每次循环时对其进行修改)。

如果您在循环中移动new tracker.Customer(),则会创建3个单独的客户对象。

答案 1 :(得分:1)

您需要在for循环的每次迭代中创建一个新的tracker.Customer,而不是在循环之外的单个实例:

foreach (var drRow in dsResults.Tables[0].Rows) 
{
    // Create a brand new instance of a customer and set its properties
    var myCustomer = new tracker.Customer()
    {
        CustomerID = Item["CustomerID"];
        FKBandID = Convert.ToInt32(drRow["FKBandID"]);
        FKSectorID = Convert.ToInt32(drRow["FKSectorID"]); 
        CustomerName = Convert.ToString(drRow["CustomerName"]);
        CustomerAddress = Convert.ToString(drRow["CustomerAddress"]);
        CustomerPhoneNumber = Convert.ToString(drRow["CustomerPhoneNumber"])
    };
    // Add your new customer to the customer collection
    myCustomerCollection.Add(myCustomer);
}

现在正在发生的事情是您的myCustomerCollection包含对同一myCustomer实例的三个引用,因为您没有为数据库中的每条记录实例化new。您现在在myCustomer中看到的值可能与数据的最后一行有关。

通过在f​​or循环的每次迭代中创建新实例,您的列表中将有三个不同的tracker.Customer对象。

这种行为在VB.NET中完全相同。