2010-12-10 5 views

Répondre

2
DateTime start = DateTime.Now; 
List<DateTime> last12 = (from r in Enumerable.Range(1,12) select start.AddMonths(0-r)).ToList(); 
+0

Je l'aime, très lisse. –

1

Il n'est pas clair si vous voulez que le mois en cours ne soit pas compté, mais cela vous indiquera dans la bonne direction que vous pouvez modifier en fonction de vos besoins.

DateTime now = DateTime.Now; 
DateTime currentMonth = new DateTime(now.Year, now.Month, 1); 
var lastTwelveMonths = 
    Enumerable.Range(0, 12) 
       .Select(i => -i) 
       .Select(monthsToAdd => currentMonth.AddMonths(monthsToAdd)) 
       .ToList(); 
+0

c'est excessive 'definetely .Choisir (i => -i)' – Andrey

+0

Pourriez-vous juste le 'déposer .Choisir (i => - i) 'et utilisez' Select (monthsToAdd => currentMonth.AddMonths (-monthsToAdd)) 'à la place? –

+0

@Abe Miessler: Oui, vous pouvez absolument, mais alors 'monthToAdd' n'est pas nommé correctement. – jason

1

Foreach est techniquement pas une méthode Linq. Il existe en tant que méthode concrète dans la classe List, mais pas dans aucune interface.

var now = DateTime.Now; 
var months = Enumerable.Range(1, 12).Select(n => now.AddMonths(-n)); 

foreach (var month in months) 
{ 
    Console.WriteLine(month.ToString("MMMM")); 
} 

Produit (en danois)

november 
oktober 
september 
august 
juli 
juni 
maj 
april 
marts 
februar 
januar 
december 
+1

Votre code a un bug méchant qui ne fera pas surface dans vos tests unitaires à moins que vous soyez très prudent, mais finira par vous tuer. Vous pouvez avoir des problèmes avec 'DateTime.Now'. Imaginons qu'il s'agisse de 'new DateTime (2010, 12, 31, 23, 59, 59, 999)' lorsque cette instruction commence à s'exécuter et qu'il faut plus d'une milliseconde pour s'exécuter. – jason

+0

@Jason si vrai, mis à jour le code pour faire une copie locale de DateTime.Now :) –

Questions connexes