2016-07-07 10 views
0

Ich muss einen Algorithmus implementieren, der eine Liste von DateTime erhält und die neueste DateTime jedes Monats wiederherstellt, und ich weiß nicht, wie es geht. Beispiel:Wie wähle ich die letzte dateTime eines jeden Monats?

29/06/2016 -> Lastest date of june 
27/06/2016 
05/05/2016 -> Lastest date of may 
15/04/2016 -> Lastest date of april 
13/04/2016 
... 

Erwartetes Ergebnis

29/06/2016 
05/05/2016 
15/04/2016 
+0

Ich würde berechnen, wie viele Tage pro Monat hat, und dann für jeden Monat überprüfen, die das letzte Datum ist. – user743414

+1

gruppieren Sie die DateTimes nach Jahr/Monat und wählen Sie Max aus jeder Gruppe – Philippe

Antwort

4

Was Sie sagen, ist das maximale Datum pro Monat aus einer Liste von Daten. Sie können die mit LINQ erhalten, indem GroupBy und Max, zB:

var maxDatesPerMonth=from date in dates 
         group date by new {date.Year,date.Month} into months 
         select months.Max(); 

oder

var maxDatesPerMonth=dates.GroupBy(date=>new {date.Year,date.Month}) 
          .Select(months=>months.Max()); 
0

Try this ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dateTimes = new[] 
     { 

      new DateTime(2016, 06, 29), 
      new DateTime(2016, 06, 27), 
      new DateTime(2016, 05, 05), 
      new DateTime(2016, 04, 15), 
      new DateTime(2016, 04, 13) 
     }; 

     var years = dateTimes.GroupBy(x => x.Year).OrderByDescending(x => x.Key); 

     foreach (IGrouping<int, DateTime> grouping in years) 
     { 
      var months = grouping.GroupBy(x => x.Month); 

      foreach (IGrouping<int, DateTime> month in months) 
      { 
       Console.WriteLine(month.First()); 
      } 
     } 

     Console.ReadLine(); 
    } 
} 

Dieser Ausgang der folgenden ...

29/06/2016 00:00:00 
05/05/2016 00:00:00 
15/04/2016 00:00:00 
+0

Es ist ein wenig grob - habe nicht wirklich Zeit, es zu optimieren, aber es sollte funktionieren. Sobald Sie die Idee haben, können Sie es rationalisieren, wie Sie für richtig halten. – Jay

+0

Warum 'First' anstelle von' Max' ?????? –

+0

Es ist bereits von der Gruppe-by-Anweisung bestellt - ich muss nur die erste auswählen, weil es genau das gleiche wie MAX ist. Wie ich schon sagte - das funktioniert, ist aber nicht optimiert. Bitte erklären Sie, warum Sie ein Problem mit Code haben, der funktioniert? – Jay

0

Sie können dieses Problem lösen mit LINQ.

Pseudo-Code:

dateList.Where(x => x.Month == 6).Max() 

Dies gibt Ihnen die letzte Datum des Juni.

Stellen Sie sicher, dass Sie die richtigen Eigenschaften Ihres DateTime-Typs anstelle von *.Month verwenden. Sie müssen möglicherweise auch die .Max(), möglicherweise mit einer .Select(x => x.Day).Max() angeben.

Trotzdem: LINQ ist der Weg zu gehen. Hoffe es hilft.

+0

Das wird nicht das Ende des Monats für die Daten zurückgeben, es wird das maximale Datum für einen einzelnen Monat zurückgeben. Sie sollten wahrscheinlich GroupBy verwenden –

Verwandte Themen