2010-08-24 4 views
1

J'ai une collection d'enregistrements. Qui ont deux boxeurs, date de match, lieu etc ... Je veux les séparer par mois et les regrouper. Actuellement, j'ai ce qui est ci-dessous. Et cela fonctionne dans une certaine mesure. Cela recherche des dates de match dans le futur. C'est cette année et passe à travers chaque mois (1-12) et trouve des correspondances dans cette plage de dates.Séparer les enregistrements en mois individuels pour mvc

Placer dans un dictionnaire gentil de int, dénombrable où int est le mois et enumberable est la collection de matches en ce mois

//Build the matches list by Months!!! 
var summarysDic = new Dictionary<int, IEnumerable<MatchSummary>>(); 
for (int i = 1; i <= 12; i++) 
{ 
    var MatchesOfMonth = matches.Where(x => x.MatchDate.Value.Year == DateTime.Now.Year && 
         x.MatchDate.Value.Month == i && 
         !x.HasResult() && 
         x.MatchDate.Value > DateTime.Now); 
    if (MatchesOfMonth.Count() > 0) 
    { 
     summarysDic.Add(i, MatchesOfMonth.OrderBy(x => x.MatchDate).Select(x=> new MatchSummary(x)).ToArray()); 
    } 
} 

problème est traite actuellement que cette année. Je voudrais plutôt faire en sorte que cela fonctionne pour "les 6 prochains mois" mais cela devrait bien sûr fonctionner aussi pour la nouvelle année!

Quel est le meilleur/le plus propre à faire cela?

merci d'avance!

PS sur une note de côté je dois encore trouver comment faire simplement DateTime.Now.Month.add (1), par exemple (comme je vais toujours aller de l'avant de la date actuelle!)

--- CODE --COMPLETED -----

//Build the matches list by Months!!! 
     var summarysDic = new Dictionary<string, IEnumerable<MatchSummary>>(); 
     for (int i = 1; i <= 12; i++) 
     { 
      var checkDate = DateTime.Now.AddMonths(i); 
      var MatchesOfMonth = matches.Where(x => x.MatchDate.Value.Month == checkDate.Month && 
           x.MatchDate.Value.Year == checkDate.Year && 
           !x.HasResult() && 
           x.MatchDate.Value > DateTime.Now); 
      if (MatchesOfMonth.Count() > 0) 
      { 
       var firstMatchDate = MatchesOfMonth.First().MatchDate.Value; 
       if (firstMatchDate.Year != DateTime.Now.Year) 
       { 
        summarysDic.Add(firstMatchDate.ToString("MMMM yyyy"), MatchesOfMonth.OrderBy(x => x.MatchDate).Select(x => new MatchSummary(x)).ToArray()); 
       } 
       else 
       { 
        summarysDic.Add(firstMatchDate.ToString("MMMM"), MatchesOfMonth.OrderBy(x => x.MatchDate).Select(x => new MatchSummary(x)).ToArray()); 
       } 

      } 
     } 
+0

semble bien maintenant Steve, une chose cependant, vous pouvez modifier la boucle à « (int i = 0; i <= 12 ... ", de sorte que vous incluerez des allumettes à partir de maintenant jusqu'à la fin de ce mois –

Répondre

1

Je crois que vous pouvez obtenir ce que vous voulez sans modifier votre algorithme de manière significative:

//Build the matches list by Months!!! 
var summarysDic = new Dictionary<int, IEnumerable<MatchSummary>>(); 
for (int i = 0; i <= 6; i++) 
{ 
    var checkDate = DateTime.Now.AddMonths(i); 
    var MatchesOfMonth = matches.Where(x => x.MatchDate.Value.Year == checkDate.Year && 
         x.MatchDate.Value.Month == checkDate.Month && 
         !x.HasResult() && 
         x.MatchDate.Value > DateTime.Now); 
    if (MatchesOfMonth.Count() > 0) 
    { 
     summarysDic.Add(i, MatchesOfMonth.OrderBy(x => x.MatchDate).Select(x=> new MatchSummary(x)).ToArray()); 
    } 
} 
+0

parfait savait qu'il y avait une façon simple de le faire :) Je l'ai également élargi afin de remplacer le" int "avec une chaîne qui sera utilisée sur la page comme en-tête de chaque groupe qui sera juste un mois (septembre) si cette année ou mois année si une autre année" Septembre 2012 " – Steve

0

Quel est le problème avec DateTime.Now.AddMonth(1)?

var MatchesOfMonth = matches.Where(x => x.MatchDate.Value <= DateTime.Now.AddMonth(i) 
            && !x.HasResult() 
            && x.MatchDate.Value > DateTime.Now); 

Je n'ai pas compilé, mais il devrait fonctionner avec seulement tweeking assez mineur ...

+0

cela causerait des problèmes car je veux tous les matchs dans août regroupés et tous les matches en sept groupés. Je ne veux pas avoir du 15 août au 15 septembre pour être regroupés – Steve

Questions connexes