2009-10-01 5 views
0

J'ai une liste qui contient des dates du 1er juin 2009 au 1er juin 2014. Comment l'interroger en C# LINQ pour sélectionner uniquement la première date de chaque mois?C# requête LINQ pour sélectionner uniquement la première date dans un mois à partir de la liste <DateTime>

+1

FYI, si c'est l'interrogation d'objets, c'est juste LINQ, pas LINQ to SQL. –

+2

Voulez-vous dire la première date dans la liste de chaque mois ou la première date du mois? – SLaks

+0

Toutes les bonnes réponses. Très bonnes approches. –

Répondre

7

La façon la plus simple que je pense est de filtrer par la propriété Day de vos dates:

var firstDays = dates.Where(d=> d.Day == 1); 
+2

Le libellé de la question est horrible. C'est une excellente solution si vous voulez le 1er de chaque mois qui apparaît dans la liste (par exemple 1er janvier, 1er février etc), mais cela ne fonctionnera pas si vous voulez la première date qui apparaît dans la liste pour chaque mois (par exemple 2 janvier si le 1er janvier n'est pas dans la liste, etc) –

6

Votre question est un peu ambigu. Si vous voulez que le premier élément figurant dans la liste chaque mois, vous pouvez utiliser:

var result = list.GroupBy(x => new { x.Year, x.Month }) 
       .Select(x => x.Min()); 
+0

Celui-là est un générique, génial. – Tarik

+0

@Aaron: Que voulez-vous dire? – SLaks

2

Comme ceci:

dates.Where(d => d.Day == 1); 

Ou, en utilisant la compréhension de la requête,

from d in dates where d.Day == 1 select d; 
2

Essayez ce qui suit

public static bool IsFirstDayOfMonth(this DateTime t) { 
    var other = new DateTime(t.Year,t.Month,1); 
    return other == t.Date; 
} 

var allDates = GetTheDates(); 
var filter = allDates.Where(x => x.IsFirstDayOfMonth()); 
Questions connexes