数据集迭代时列表值会发生变化

时间:2014-09-01 05:20:36

标签: c# asp.net collections

我有Date_Check类型的List,我执行sql查询并检索数据集中的值 并且我通过遍历数据集来填充List,问题是当第二次迭代朝向列表[0],列表[1],列表[2] ...值时被当前对象值替换

这是我的代码:

 string query = "select Record_Id, Movie_Name from tbl_theater_master ";
 DataSet dtst_Theatrs = new DataSet();
 dtst_Theatrs = ObjCommon.GetObject.ExecuteQuery_Select(Connection.ConnectionString, query);

 if (dtst_Theatrs.Tables[0].Rows.Count != 0)
 {
   List<Date_Check> lst_Date_Check = new List<Date_Check>();
   Date_Check obj_Date_Check = new Date_Check();

   for (int i = 0; dtst_Theatrs.Tables[0].Rows.Count > i; i++)
   {
        obj_Date_Check.Movie_Name = dtst_Theatrs.Tables[0].Rows[i]["Movie_Name"].ToString();
        obj_Date_Check.Record_Id = dtst_Theatrs.Tables[0].Rows[i]["Record_Id"].ToString();
         lst_Date_Check.Add(obj_Date_Check);
   }
 }

这是我的Date_Check对象:

 public class Date_Check
{
    public string Record_Id { get; set; }
    public string Movie_Name { get; set; }
}

当数据集迭代完成时,lst_Date_Check将所有索引更改为Last迭代值,我的代码出了什么问题

2 个答案:

答案 0 :(得分:1)

继续在for循环中创建类Date_Check obj_Date_Check = new Date_Check();的对象。这就是你在每次迭代中创建新对象的方式。

for (int i = 0; dtst_Theatrs.Tables[0].Rows.Count > i; i++)
{
     Date_Check obj_Date_Check = new Date_Check();
     obj_Date_Check.Movie_Name = dtst_Theatrs.Tables[0].Rows[i]["Movie_Name"].ToString();
     obj_Date_Check.Record_Id = dtst_Theatrs.Tables[0].Rows[i]["Record_Id"].ToString();
     lst_Date_Check.Add(obj_Date_Check);
}

答案 1 :(得分:0)

这是因为您的Date_Check对象是引用类型而不是值类型。这意味着行Date_Check obj_Date_Check = new Date_Check();在内存中创建一次变量,然后在每次更新该对象时更新同一个对象。您有两个选择:

for循环中实例化对象,在内存中创建一个对象,即:

for (int i = 0; dtst_Theatrs.Tables[0].Rows.Count > i; i++)
   {
        Date_Check obj_Date_Check = new Date_Check();
        obj_Date_Check.Movie_Name = dtst_Theatrs.Tables[0].Rows[i]["Movie_Name"].ToString();
        obj_Date_Check.Record_Id = dtst_Theatrs.Tables[0].Rows[i]["Record_Id"].ToString();
         lst_Date_Check.Add(obj_Date_Check);
   }

或者使用Date_CheckValue Type对象创建为Struct,即:

public struct Date_Check
{
    public string Record_Id { get; set; }
    public string Movie_Name { get; set; }
}