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

本文关键字:一个 添加 列表 最后一个 新项目 索引 | 更新日期: 2023-09-27 18:10:42

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

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接收到的值将接收该值并存储在列表中。问题是for循环第一次迭代时,tempTable中的值为:

FieldName = "Total Working days" 

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

任何帮助。提前感谢

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

从您当前的代码来看,您不需要循环,您从不使用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中有一个构造函数来设置这两个值。

<<p> 解决方案/strong>

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

修改变量名就可以了

尝试用不同的名称创建TempTable的新变量,或者只是使用重新实例化的对象。这里不需要if-condition,因为您不是for-loop:

中提到的ct。为了更好的可读性,不要使用冗长的变量:
 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;} }     
}