2010-04-16 5 views
4

Si j'ai une paire de dates, et je veux générer une liste de toutes les dates entre eux (inclus), je peux faire quelque chose comme:Exploding une plage de dates avec LINQ

System.DateTime s = new System.DateTime(2010, 06, 05); 
System.DateTime e = new System.DateTime(2010, 06, 09); 
var list = Enumerable.Range(0, (e - s).Days) 
    .Select(value => s.AddDays(value)); 

Ce que je Je suis coincé, c'est que j'ai une liste de paires de dates que je veux exploser dans une liste de toutes les dates entre eux. Exemple:

{2010-05-06, 2010-05-09}, {2010-05-12, 2010-05-15} 

devrait se traduire par

{2010-05-06, 2010-05-07, 2010-05-08, 2010-05-09, 2010-05-12, 2010-05-13, 2010-05-14, 2010-05-15} 

Notez les paires de dates sont garanties de ne pas se chevaucher.

+2

TimeSpan.Days **! = ** TimeSpan.TotalDays http://msdn.microsoft.com/en-us/library/system.timespan.days(v=VS.100). aspx http://msdn.microsoft.com/en-us/library/system.timespan.totaldays(v=VS.100).aspx – dtb

+0

Oui, Days! = TotalDays, mais Days est ce que je veux ici. Voyez les exemples des liens que vous avez donnés: TimeSpan (1) .Days == 0; TimeSpan (1) .TotalDays == 1,15740740740741E-12; TimeSpan (111222333444555) .Jours == 128; TimeSpan (111222333444555) .TotalDays == 128.729552597865; Dans le premier exemple, la boucle 0..0 donnerait un seul jour, ce que je veux. Dans le deuxième exemple, boucler 0..128 donnerait 129 jours, ce qui est encore ce que je veux. Je suppose que je pourrais boucler 1..ceil (128.729552597865), puis retourner à Add.Jours (valeur - 1), mais pourquoi le ferais-je? –

+0

Juste en soulignant que l'utilisation de 'Days' casse quand les deux' DateTime' valeurs sont plus d'un mois d'intervalle les uns des autres. :) – dtb

Répondre

5
var result = listOfPairs.SelectMany(pair => 
       Enumerable.Range(0, (pair.Item2 - pair.Item1).TotalDays) 
          .Select(days => pair.Item1.AddDays(days))); 
+0

Cela semble bien si le «retour» est abandonné. –

+0

Réponse mise à jour pour ne pas avoir de 'retour' :) – dtb

+0

Oui, c'est ce que je cherchais: une méthode LINQy extensible. Génial merci. –

0

Je pense que vous pourriez utiliser un simple List<DateTime> pour accomplir ce que vous voulez.

List<DateTime> list = new List<DateTime>(); 
list.AddRange(GetListDates(d1, d2)); 
list.AddRange(GetListDates(d3, d4));