在列表中添加新项目会添加上一个索引上添加到列表的最后一个值

时间:2014-06-30 06:23:48

标签: c# list

这是我的代码,应该将对象值添加到列表中。

public List<tempTable> GetAttendanceLeaveReportForChart(double totalWorkingdays, double attendanceDays, double leaveData, double absentData) 
{       
    List<tempTable> temp = new List<tempTable>();
    for (int ct = 0; ct < 4; ct++)
    {
        if (ct == 0) 
        {
            tempTable tempTableForAttendAndLeaveReport = new tempTable();          
            tempTableForAttendAndLeaveReport.FieldName = "Total working days";
            tempTableForAttendAndLeaveReport.FieldValue = Convert.ToDouble(totalWorkingdays);
            temp.Add(tempTableForAttendAndLeaveReport); 
        }
        else if (ct == 1)
        {
            tempTable tempTableForAttendAndLeaveReport = new tempTable(); 
            tempTableForAttendAndLeaveReport.FieldName = "Attendance"; 
            tempTableForAttendAndLeaveReport.FieldValue = Convert.ToDouble(attendanceDays); 
            temp.Add(tempTableForAttendAndLeaveReport); 
        }
        else if (ct == 2)
        {
            tempTable tempTableForAttendAndLeaveReport = new tempTable();
            tempTableForAttendAndLeaveReport.FieldName = "Leave"; 
            tempTableForAttendAndLeaveReport.FieldValue = Convert.ToDouble(leaveData); 
            temp.Add(tempTableForAttendAndLeaveReport); 
        }
        else if (ct == 3) 
        {
            tempTable tempTableForAttendAndLeaveReport = new tempTable();
            tempTableForAttendAndLeaveReport.FieldName = "Absent";
            tempTableForAttendAndLeaveReport.FieldValue = Convert.ToDouble(absentData); 
            temp.Add(tempTableForAttendAndLeaveReport); 
        }
    }     
    return temp;
}

在这里,我创建了一个存储价值的类名tempTable。从tempTableForAttendandLeaveReport收到的值将收到值并存储在列表中。问题是第一次循环迭代,tempTable中的值是:

FieldName = "Total Working days" 

fieldValue来自参数接收的变量。但是当循环迭代第二次时,在第一个循环中接收的值将被覆盖在列表中。在第二次迭代中,列表索引0和1处的值是添加到列表的最新值。 我不知道这是怎么发生的......

任何帮助。提前致谢

3 个答案:

答案 0 :(得分:2)

从查看当前代码,您不需要循环,您永远不会使用ct的值,并且您不需要if - 语句。要获得相同的结果,这是您需要的唯一代码:

public List<tempTable> GetAttendanceLeaveReportForChart(double totalWorkingdays, double attendanceDays, double leaveData, double absentData) 
{       
    List<tempTable> temp = new List<tempTable>();
    temp.add(new tempTable("Total working days", Convert.ToDouble(totalWorkingdays));
    //and etc for other 3 values
    return temp;
}

假设你在tempTable中有一个构造函数来设置这两个值。

<强>解决方案

问题是tempTable的字段值是static所以总是保留分配给它们的最后一个值。这些字段不应该是静态的。

答案 1 :(得分:1)

尝试使用不同的名称创建TempTable的新变量,或者只使用重新实例化的对象。在这里,您不需要if条件,因为ct中没有提到for-loop

为了更好的可读性,请不要使用冗长的变量:

 public List<tempTable> GetAttendanceLeaveReportForChart(double totalWorkingdays, double attendanceDays, double leaveData, double absentData) 
 { 
     List<tempTable> temp = new List<tempTable>();

     tempTable obj = new tempTable();          
     obj.FieldName = "Total working days";
     obj.FieldValue = Convert.ToDouble(totalWorkingdays);
     temp.Add(obj);        

     obj = new tempTable(); 
     obj.FieldName = "Attendance"; 
     obj.FieldValue = Convert.ToDouble(attendanceDays); 
     temp.Add(obj); 

     obj = new tempTable();
     obj.FieldName = "Leave"; 
     obj.FieldValue = Convert.ToDouble(leaveData); 
     temp.Add(obj);    

     obj = new tempTable();
     obj.FieldName = "Absent";
     obj.FieldValue = Convert.ToDouble(absentData); 
     temp.Add(obj);        

     return temp;
}

<强>更新

public class tempTable 
{ 
   private string _FieldName;   //don't use static
   private double _FieldValue;  //don't use static
   public string FieldName { get { return _FieldName; } set { _FieldName = value; } }
   public double FieldValue { get { return _FieldValue; } set { _FieldValue = value;} }     
}       

答案 2 :(得分:1)

更改变量名称然后它将起作用。