2010-04-23 5 views
1

Objectif: Générer des dates basées sur les numéros de semainecela peut-il être fait en utilisant LINQ/Lambda, C# 3.0

Entrée: StartDate, Semaine n °

Sortie: Liste des dates de la semaine nombre spécifié jusqu'au StartDate ie Si startdate est le 23 avril 2010 et que le numéro de la semaine est 1, alors le programme doit renvoyer les dates du 16 avril 2010 jusqu'au début du jour.

La fonction

public List<DateTime> GetDates(DateTime startDate,int weeks) 
     { 
      List<DateTime> dt = new List<DateTime>(); 
      int days = weeks * 7; 

      DateTime endDate = startDate.AddDays(-days); 
      TimeSpan ts = startDate.Subtract(endDate); 
      for (int i = 0; i <= ts.Days; i++) 
      { 
       DateTime dt1 = endDate.AddDays(i); 
       dt.Add(dt1); 
      } 

      return dt; 
     } 

J'appelle cette fonction

DateTime StartDate = DateTime.ParseExact("20100423", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); 
      List<DateTime> dtList = GetDates(StartDate, 1); 

Le programme fonctionne bien.

La question utilise la fonctionnalité C# 3.0 comme Linq, Lambda etc. Puis-je réécrire le programme.

Pourquoi? Parce que j'apprends linq et lambda et que je veux appliquer la même chose. Mais à partir de maintenant, la connaissance n'est pas suffisante pour faire la même chose par moi-même.

Merci.

Répondre

1

Quelque chose comme ceci:

public IEnumerable<DateTime> GetDates2(DateTime startDate, int weeks) 
{ 
    var days = weeks * 7; 
    return Enumerable.Range(-days, days + 1).Select(i => startDate.AddDays(i)); 
} 

La méthode Enumerable.Range renvoie une séquence d'entiers dans une plage spécifiée, dans votre exemple -7-0. Après cela, j'utilise simplement chaque entier pour soustraire ce nombre de jours de startDate initial, en construisant un IEnumerable<DateTime>.

+0

Ne pas oublier d'inclure ToList() afin qu'il corresponde à l'autre méthode en termes de production et de l'exécution immédiate. –

1

Vous pouvez essayer quelque chose comme

int weeks = 1; 
var days = from d in Enumerable.Range(-weeks * 7, weeks * 7 + 1) 
      select StartDate.AddDays(d); 
Questions connexes