Рекурсия и возврат даты в C # - PullRequest
1 голос
/ 08 октября 2009

Я не могу заставить этот метод вернуть правильную дату. Этот метод использует текущую дату и добавляет количество дней, которое вы укажете. Так что если вы хотите следующий понедельник, он вернется в следующий понедельник. Он также отправляет дату в метод, который проверяет, является ли она одной из «отфильтрованных дат», которую нельзя возвращать. Это все работает отлично, за исключением рекурсии. Что я хотел сделать, так это то, что если дата является «отфильтрованной датой», запустите тот же метод еще раз, добавляя дни, пока она не достигнет нефильтрованной даты. Что происходит, хотя, скажем, я передаю в 10/12/2009, и это отфильтрованная дата, он делает рекурсию, добавляет дни и возвращает 19.10.2009, но потом похоже, что он возвращается снова, но возвращается , Что я делаю неправильно? спасибо

private static DateTime Next(DateTime current, DayOfWeek dayOfWeek, int weeksAhead)
{
    int offsetDays = dayOfWeek - current.DayOfWeek;
    if (offsetDays <= 0)
    {
        offsetDays += 7 * weeksAhead;
    }
    DateTime result = current.AddDays(offsetDays);
    //MAKE SURE RESULT IS NOT A FILTERED DATE
    if (IsFiltered(result))
    {
        Next(result, dayOfWeek, 1);

    }
    //IF IT IS, RUN NEXT AGAIN WITH AN INCREMENTAL WEEK
    return result;
}

Ответы [ 3 ]

8 голосов
/ 08 октября 2009

Заменить

Next(result, dayOfWeek, 1);

с

return Next(result, dayOfWeek, 1);

Вы не возвращаете (и не храните) результат рекурсивного вызова.

0 голосов
/ 08 октября 2009

private static DateTime Next(DateTime current, DayOfWeek dayOfWeek, int weeksAhead)
{
    current = current
        .AddDays((current.DayOfWeek - dayOfWeek) * -1)
        .AddDays(7 * weeksAhead);

    // recursive approach
    if (IsFiltered(current))
    {
        return Next(current, dayOfWeek, 1);
    }
    else
    {
        return current;
    }

    // I prefer this approach, without recursion
    while(IsFiltered(current))
        current = Next(current, dayOfWeek, 1);
    return current;
}
0 голосов
/ 08 октября 2009

Вы не возвращаете результат в своем выражении if (IsFiltered (result)). Измените его на:

if (IsFiltered(result))
{
    return Next(result, dayOfWeek, 1);
}
else
{
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...