【问题标题】:list values changes when dataset iteration数据集迭代时列表值发生变化
【发布时间】:2014-09-01 05:20:36
【问题描述】:

我有 Date_Check 类型的列表,我执行 sql 查询并检索数据集中的值 我通过遍历数据集来填充列表,问题是当第二次迭代到 list[0],list[1],list[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 迭代值,我的代码有什么问题

【问题讨论】:

    标签: c# asp.net collections


    【解决方案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);
    }
    

    【讨论】:

      【解决方案2】:

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

      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);
         }
      

      或使用Struct 将您的Date_Check 对象创建为Value Type,即:

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

      【讨论】:

        猜你喜欢
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        • 2021-10-20
        • 2018-10-29
        • 1970-01-01
        • 2019-02-14
        相关资源
        最近更新 更多