编程新手并且List <t> </t>出现问题

时间:2009-10-20 21:58:39

标签: c# list object

    PAW.Btrieve oBtrieve = new PAW.Btrieve();
    PAW.CustomerClass oCustomer = new PAW.CustomerClass();
    int Status = oBtrieve.Connect("Z:\\payinc");

    if (Status == 0)
    {
        GC.Collect();
        Status = oCustomer.OpenFile();
        if (Status == 0)
        {
            Status = oCustomer.GetFirst();
            int cnt = oCustomer.RecordCount();
            List<Customer> Custlist = new List<Customer>();
            for (int i = 0; i < cnt; i++)
            {
                Custlist.Add(oCustomer);
                oCustomer.GetNext();
            }
            GridView1.DataSource = Custlist;
            GridView1.DataBind();
        }
        Status = oCustomer.CloseFile();
        GC.Collect();
    }

    oBtrieve.Disconnect();
    oBtrieve = null;

在这段代码的最后,我有数据网格中显示的最后一个客户的28份副本,而不是我想要看到的28位不同客户。有没有办法只存储来自oCustomer对象的数据而不是对oCustomer对象的依赖?

3 个答案:

答案 0 :(得分:3)

看起来您正在使用的特定API会为其检索的每个客户重复使用相同的CustomerClass实例:

oCustomer.GetNext();

因此,每次将oCustomer添加到列表中时,都会添加相同的实例,并且对“GetNext”的调用正在更改该实例的属性。

我建议将oCustomer的各个属性复制到该类的新实例中,并将其添加到列表中。也许是这样的事情:

Custlist.Add(new CustomerClass
{
    // obviously I don't know what the properties of
    // CustomerClass are, so humour me.

    Name = oCustomer.Name,
    Address = oCustomer.Address,
    Phone = oCustomer.Phone
});

这样,您每次都会在列表中添加不同的客户实例。

答案 1 :(得分:1)

您要为每个人添加oCustomer。您应该使用迭代器i来访问oCustomer中的(我认为是什么)集合。

我不确定你的班级结构是什么,但是

for (int i = 0; i < cnt; i++)
{
    Custlist.Add(oCustomer);
    oCustomer.GetNext();
}

应该是:

for (int i = 0; i < cnt; i++)
{
    Custlist.Add(oCustomer[i]);
    oCustomer.GetNext();
}

另外,请勿使用GC.Collect()。那只是在寻找麻烦。

答案 2 :(得分:1)

我猜这是因为PAW.CustomerClass是一个引用类型,而CustomerClass.GetNext()将下一个项目读入现有对象......而不是创建一个新项目。

每次将对象添加到列表时,它都会添加对象的引用而不是对象的副本。这意味着当您在将对象添加到列表后更新对象上的值时,列表中的对象将反映这些更改...并且由于GetNext()每次迭代都会对同一对象进行更改,因此您的列表有29个引用SAME CustomerClass对象。

您可以尝试更改以下行:

Custlist.Add(oCustomer);

// assuming a shallow copy will work for this object
Custlist.Add(oCustomer.MemberwiseClone());