#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.