2009-10-08 4 views
1

Je ne peux pas obtenir cette méthode pour retourner la bonne date. Cette méthode prend la date actuelle et ajoute le nombre de jours que vous spécifiez. Donc, si vous voulez le lundi suivant, il reviendra le lundi suivant. Il envoie également la date dans une méthode qui vérifie si c'est l'une des "dates filtrées" qui ne peuvent pas être retournées. Tout cela fonctionne bien, sauf pour la récursivité. Ce que je voulais faire, c'est que si une date est une "date filtrée", recommencez la même méthode, en ajoutant des jours jusqu'à ce qu'elle atteigne une date non filtrée. Ce qui se passe cependant, c'est dire que je passe en 10/12/2009 et que c'est une date filtrée, il fait la récursion, ajoute les jours et revient le 19/10/2009 mais ensuite on dirait qu'il revient encore mais revient 10/12/2009 . Qu'est-ce que je fais mal? grâceRécursion et retour Dates en C#

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; 
} 

Répondre

8

Remplacer

Next(result, dayOfWeek, 1); 

avec

return Next(result, dayOfWeek, 1); 

Vous n'êtes pas retournerez (ni stockage), le résultat de l'appel récursif.

0

Vous ne renvoyez pas le résultat dans votre instruction if (IsFiltered (result)). Changer à:

if (IsFiltered(result)) 
{ 
    return Next(result, dayOfWeek, 1); 
} 
else 
{ 
    return result; 
} 
0

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; 
}