这是我的代码:
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
的值。
我在哪里犯了错误?
答案 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
的引用放在哪里。