c#winForms数组列表的奇怪结果

时间:2010-03-29 03:29:36

标签: c# winforms list arrays

所以我试图将值存储在C#winForms的Lists数组中。在我制作sql语句的for循环中,一切正常:消息框每次都输出一个不同的药物名称。

for (int i = 0; i < numberOfMeds; i++)
{

 queryStr = "select * from biological where medication_name = '" + med_names[i] + "' and patient_id = " + patientID.patient_id;

 using (var conn = new SqlConnection(connStr))
 using (var cmd = new SqlCommand(queryStr, conn))
 {
  conn.Open();

  using (SqlDataReader rdr = cmd.ExecuteReader())
  {
   while (rdr.Read())
   {
    medObject.medication_date = (DateTime)rdr["patient_history_date_bio"];
    medObject.medication_name = rdr["medication_name"].ToString();
    medObject.medication_dose = Convert.ToInt32(rdr["medication_dose"]);

    medsList[i].Add(medObject);

   }
  }
  conn.Close();

  MedicationTimelineClass medObjectx = medsList[i][0] as MedicationTimelineClass;
  MessageBox.Show(medObjectx.medication_name);
 }
}

然后,当我从循环中取出消息框代码时,意味着应该填充Lists数组,我总是得到相同的值:输入的最后一个值。相同的药物名称,无论我放在这些括号之间的数字。就好像整个Lists数组都填充了相同的数据。

for (int i = 0; i < numberOfMeds; i++)
{

 queryStr = "select * from biological where medication_name = '" + med_names[i] + "' and patient_id = " + patientID.patient_id;

 using (var conn = new SqlConnection(connStr))
 using (var cmd = new SqlCommand(queryStr, conn))
 {
  conn.Open();

  using (SqlDataReader rdr = cmd.ExecuteReader())
  {
   while (rdr.Read())
   {
    medObject.medication_date = (DateTime)rdr["patient_history_date_bio"];
    medObject.medication_name = rdr["medication_name"].ToString();
    medObject.medication_dose = Convert.ToInt32(rdr["medication_dose"]);

    medsList[i].Add(medObject);

   }
  }
  conn.Close();


 }
}

MedicationTimelineClass medObjectx = medsList[0][0] as MedicationTimelineClass;
MessageBox.Show(medObjectx.medication_name);

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

看起来你在循环中重复使用相同的MedicationTimelineClass对象。请记住,您的类是引用类型。您基本上是在列表中添加相同的引用,并更新该引用中对象中存储的属性的值。最终,列表中的所有“项目”都指向同一个对象。

每次迭代实例化一个新的MedicationTimelineClass对象,然后将该新对象添加到列表中。

答案 1 :(得分:2)

在“while(rdr.Read())”循环中,您每次只是将相同的对象(medObject)添加到列表中。列表 一遍又一遍地填充相同的对象。