добавление нового элемента в список добавляет последнее значение, добавленное в список по предыдущему индексу

#c# #list

#c# #Список

Вопрос:

Это мой код, который должен добавлять значение объекта в список.

 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 является последним значением, добавленным в список.
Я понятия не имею, как это происходит…

Любая помощь. Заранее спасибо

Ответ №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 для установки двух значений.

Решение

Проблема заключалась в том, что значения полей TempTable static всегда сохраняли последнее присвоенное им значение. Поля не должны были быть статическими.

Комментарии:

1. я сделал именно это. по-прежнему temp возвращает список 4 со всеми именами полей как «Отсутствующими», а значение поля как absentData.

2. открытый класс TempTable { частная статическая строка _FieldName; частное статическое двойное _FieldValue; публичное строковое имя поля { get { return _FieldName; } set { _FieldName = значение; } } public double FieldValue { get { return _FieldValue; } set { _FieldValue = значение; } } }

3. Ваши поля static , что означает, что они имеют только одно значение для всех экземпляров TempTable — это последнее значение, присвоенное им. Удалите static ключевое слово, и оно будет работать.

4. о боже… DJ_polly, большое спасибо.. Я чесал голову в течение 2 дней. большое спасибо..

5. поддержано за вопрос о tempTable классе и определение актуальной проблемы.

Ответ №2:

Измените имя переменной, тогда она будет работать.

Комментарии:

1. «tempTableForAttendAndLeaveReport »

Ответ №3:

Попробуйте создать новую переменную 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;} }     
}       
  

Комментарии:

1. я сделал именно это. по-прежнему temp возвращает список 4 со всеми именами полей как «Отсутствующими», а значение поля как absentData.