不正确的值被放入C#的列表中

时间:2014-01-05 14:07:13

标签: c# list

这是我的代码:

List<Firma> dane = new List<Firma>();
Firma firma = new Firma();
while (reader.Read())
{
    firma.Nazwa = (string)reader["Nazwa"];
    firma.Skrot = (string)reader["IDfirmy"];
    firma.ID = (int)reader["ID"];
    dane.Add(firma);
}

我的数据库中有两个具有不同值的记录,但在执行此代码后,我在dane列表中有两个完全相同的元素。我在dane.Add(firma);上放了一个断点,有些东西我不明白。在while的第一次迭代中,firma中的值正确,dane中没有任何值(所以一切都很正常),但在第二次迭代中,firma中有新值(仍然OK),但dane列表中的第一个元素(在前一次迭代中添加)具有第二次迭代firma的值。

我在哪里犯了错误?

4 个答案:

答案 0 :(得分:3)

那是因为您在每次迭代中都在同一个实例上运行。试试这个:

List<Firma> dane = new List<Firma>();

while (reader.Read())
{
    Firma firma = new Firma();
    firma.Nazwa = (string)reader["Nazwa"];
    firma.Skrot = (string)reader["IDfirmy"];
    firma.ID = (int)reader["ID"];
    dane.Add(firma);
}

在您的版本中,您将相同的Firma对象放入列表两次(两个引用指向同一对象),并在第二次迭代中覆盖其属性。

答案 1 :(得分:2)

您正在修改列表中添加的Firma类的相同引用。

在while循环中创建 新实例

while (reader.Read())
{
    Firma firma = new Firma();
    firma.Nazwa = (string)reader["Nazwa"];
    firma.Skrot = (string)reader["IDfirmy"];
    firma.ID = (int)reader["ID"];
    dane.Add(firma);
}

OR

在每次迭代时都有声明,但 ,创建一个新对象 ,这样它就不会影响列表中已经添加的对象引用。

Firma firma = null;
while (reader.Read())
{
    firma = new Firma();
    firma.Nazwa = (string)reader["Nazwa"];
    firma.Skrot = (string)reader["IDfirmy"];
    firma.ID = (int)reader["ID"];
    dane.Add(firma);
}

答案 2 :(得分:1)

您的代码问题在于您没有在每次迭代中创建Firma类的实例

while (reader.Read())
{
    Firma firma = new Firma();
    firma.Nazwa = (string)reader["Nazwa"];
    firma.Skrot = (string)reader["IDfirmy"];
    firma.ID = (int)reader["ID"];
    dane.Add(firma);
}

答案 3 :(得分:1)

为什么不使用:

while (reader.Read())
{
    dane.Add(new Firma {
        Nazwa = (string)reader["Nazwa"],
        Skrot = (string)reader["IDfirmy"],
        ID = (int)reader["ID"]
    });
}

然后您不必担心将Firma的引用放在哪里。