2010-12-09 4 views
2

J'ai un tableau de dates avec les valeurs ci-dessous: "07/07/2011", "08/05/2011", "09/07/2011", "12/07/2011" En utilisant ceci comme entrée dans mon programme C#, j'ai besoin de construire une nouvelle collection qui aura des dates manquantes ... 10/07/2011, 11/07/2011.Trouver des dates manquantes d'une collection

La récursivité est-elle la meilleure façon d'y parvenir?

Merci.

+1

récursivité est pas souvent la réponse. Mais quant à la question, 1) Le "08/05/2011" devrait-il être "08/07/2011"? 2) Le motif implicite est-il le motif réel, comme vous avez des intervalles mensuels pour vos dates fournies et manquantes? –

+0

Pour des idées, voir ces questions http://stackoverflow.com/search?q=missing+dates+%5Bc%23%5D –

+0

Les stockez-vous sous forme de chaînes ou de dates? –

Répondre

3

Pas du tout. Cela devrait être un processus simple. Vous avez une date de début, vous avez un intervalle ... Vous commencez à parcourir le tableau et si la valeur suivante ne correspond pas à votre valeur précédente plus l'intervalle, vous insérez une nouvelle valeur dans le nouveau tableau. Si cela correspond, vous copiez cette valeur.

Si vous avez besoin de plus de données (métadonnées) sur chaque entrée puis créer une classe qui contient la date et quelles que soient les métadonnées que vous trouvez utiles (par exemple un bool comme this_value_was_inserted_artificially)

En utilisant récursion compliquerait inutilement les choses.

2

Aucune récursivité nécessaire. Cela peut sans doute être optimisé, mais devrait faire le travail:

public static IEnumerable<DateTime> FindMissingDates(IEnumerable<DateTime> input) 
{ 
    // get the range of dates to check 
    DateTime from = input.Min(); 
    DateTime to = input.Max(); 

    // how many days? 
    int numberOfDays = to.Subtract(from).Days; 

    // create an IEnumerable<DateTime> for all dates in the range 
    IEnumerable<DateTime> allDates = Enumerable.Range(0, numberOfDays) 
     .Select(n => from.AddDays(n)); 

    // return all dates, except those found in the input 
    return allDates.Except(input); 
} 
+0

On dirait que le PO cherche un intervalle de * mois *, cependant. –

+0

@Dan Tao: cela dépend si vous êtes américain ou non. –

+0

Peu importe, j'ai oublié que je suis en Amérique où nous écrivons nos dates ass-backwards;) –

1

Vous pouvez retirer ceci très bien avec Linq:

var dates=new[]{ 
    DateTime.Parse("07/07/2011"), 
    DateTime.Parse("08/07/2011"), 
    DateTime.Parse("09/07/2011"), 
    DateTime.Parse("12/07/2011")}; 

var days=(dates.Max()-dates.Min()).Days; 

var otherDays= 
    Enumerable 
     .Range(0,days) 
     .Select(d=>dates.Min().AddDays(d)) 
     .Except(dates); 
Questions connexes