2014-09-01 9 views
0

我有類型Date_Check的列表,我執行一個sql查詢並檢索數據集中的值 ,並通過迭代遍歷數據集來填充列表,問題是當第二次迭代朝向列表[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得到了所有的指標改爲最後迭代值,有什麼錯我的代碼

回答

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

這是因爲你的Date_Check對象是引用類型而不是值類型。這意味着Date_Check obj_Date_Check = new Date_Check();行會在內存中創建一次變量,並且從此每次更新該對象時,都會更新相同的單個對象。你有兩個選擇:

實例化for循環內的對象在內存中創建一個對象與IE的工作:

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