2016-09-15 3 views
0

Я пишу здесь какой-то производственный код, и мне нужно добавить код моего собственного дизайна поверх кода, который уже немного проблематичен. У меня есть цикл, который помогает вычислять даты на основе определенного периода оплаты.Добавление дней на C# Неверный объект DateTime, который не выполняется во время цикла

Проблема, с которой я сталкиваюсь, заключается в том, что мои объекты Nullable DateTime вообще не меняются при добавлении к ним значений с помощью вызова функции DateTime?.Value.AddDays(). Когда я просматриваю этот код, объект nextPayDate и его значение остаются неизменными, хотя я добавляю к нему во время цикла. Указанное поведение не полезно, а также создает бесконечный цикл. Мысли?

public static List<DateTime?> GetLPSPaymentDates(Applicant applicant, int loanTermType, DateTime deliveryConfirmationDate) 
{ 

    if (applicant == null) 
    { 
     throw new Exception("The applicant you are wanting to set an LPS for is null"); 
    } 

    DateTime? firstPaymentDate = DateTime.Today; 
    DateTime? secondPaymentDate = DateTime.Today; 
    DateTime? lastPayDate = applicant.MainEmployer.LastPayDate; 
    DateTime? nextPayDate = applicant.MainEmployer.NextPayDate; 

    DateTime? earliestPossiblePaymentDate = deliveryConfirmationDate.AddDays(10); 

    int daysToAdd = 0; 
    if (lastPayDate != null && nextPayDate != null) 
    { 
     var tempDate = nextPayDate; 
     while (tempDate.Value <= earliestPossiblePaymentDate.Value) 
     { 
      daysToAdd =  IncrementPaymentDateByTermType((TermTypes)loanTermType); 
      nextPayDate.Value.AddDays(daysToAdd); 
      firstPaymentDate.Value.AddDays(daysToAdd); 
     } 
     if (firstPaymentDate == DateTime.Today) 
     { 
      firstPaymentDate = nextPayDate; 
     } 
     secondPaymentDate = firstPaymentDate.Value.AddDays(daysToAdd); 
    } 
    else 
    { 
     throw new Exception("Could not find applicant's last or next pay date."); 
    } 

    List<DateTime?> firstAndSecondDates = new List<DateTime?>() 
    { 
     firstPaymentDate, 
     secondPaymentDate 
    }; 

    return firstAndSecondDates; 

} 

public static int IncrementPaymentDateByTermType(TermTypes termType) 
{ 
    int numberOfDaysToAdd; 

    switch (termType) 
    { 
     case TermTypes.BiWeekly: 
      numberOfDaysToAdd = 14; 
      break; 
     case TermTypes.Weekly: 
      numberOfDaysToAdd = 7; 
      break; 
     default: 
      numberOfDaysToAdd = 1; 
      break; 
    } 
    return numberOfDaysToAdd; 
} 
+0

'nextPayDate.Value.AddDays (daysToAdd);' AddDays возвращает NEW DateTime с новым значением. Intellisense: 'Возвращает новый System.DateTime, который добавляет указанное количество дней к значению этого экземпляра.' – Plutonix

+0

Вы должны держать это в переменной 'nextPayDate.Value.AddDays (daysToAdd);' исходная дата не изменяется , –

+0

с нулевым значением DateTimes имеет гораздо меньше функций и ведет себя по-разному, чем DateTime. Если вы работаете с БД, нулевое значение для поля DateTime даст год 1000. Вы можете использовать регулярную DateTime и тестировать DateTime.Year> 2000, если вы хотите использовать DateTime вместо работы с NULL. –

ответ

1

AddDays возвращает новый объект в результате вместо обновления существующего объекта. Попробуйте:

daysToAdd = IncrementPaymentDateByTermType((TermTypes)loanTermType); 
nextPayDate = nextPayDate.Value.AddDays(daysToAdd); 
firstPaymentDate = firstPaymentDate.Value.AddDays(daysToAdd); 
0

не проверял, но это должно помочь (учитывая вашу логику в то время как петля правильно)

while (tempDate.Value <= earliestPossiblePaymentDate.Value) 
{ 
    daysToAdd = IncrementPaymentDateByTermType((TermTypes)loanTermType); 
    tempDate = nextPayDate.Value.AddDays(daysToAdd); // <<= updating tempDate 
    firstPaymentDate.Value.AddDays(daysToAdd); 
} 
+0

Большое спасибо всем, кто помог ответить на этот вопрос; в конце концов, вы все были правы. Я делал простую ошибку, фактически не сохраняя измененное значение в переменной, которая является отслеживаемой и осязаемой. Логика цикла правильная, и все работает сейчас. Спасибо заглядывает. Просто так вы все знаете, я проголосовал за оба ответа здесь. Спасибо тем, кто тоже прокомментировал. – shimmerwoof

+0

@shimmerwoof, пожалуйста, примите ответ, если он решит вашу проблему. –

Смежные вопросы