2010-08-24 16 views
7

ho un IEnumerable di una classe elemento definito così:Gruppo DateTime da un tempo arbitrario intervallo

public class Item { 
    public DateTime Date { get; private set; } 
    public decimal? Value { get; private set; } 

    public Item(DateTime date, decimal? value) { 
    Date = date; 
    Value = value; 
    } 
} 

Questi articoli sono in un intervallo di tempo specifico (5 minuti, per esempio). Ho bisogno di raggrupparli per la data, ma cambiando l'intervallo. Per esempio, se gli articoli sono nel seguente ordine:

2010-08-24 00:05 
2010-08-24 00:10 
2010-08-24 00:15 
2010-08-24 00:20 
2010-08-24 00:25 
2010-08-24 00:30 

e voglio raggrupparli in un intervallo di 15 minuti, il risultato dovrebbe essere simile a questo:

2010-08-24 00:15 
2010-08-24 00:30 

L'intervallo è fornito da un'altra classe, ma posso ottenere i millisecondi che rappresentano quell'intervallo (ad esempio, Interval.FromMinutes (5) .GetMilliseconds() dovrebbe restituire 300000). La domanda è: come posso scrivere una funzione di raggruppamento che mi permetta di fare qualcosa del genere: data = items.GroupBy(t => GroupingFunction(t.DateTime, interval)) e ottenere quel risultato?

Aggiornamento: l'intervallo non sarà necessariamente in minuti. Potrebbe essere in ore, minuti o persino giorni.

+0

Volete raggruppamento o filtro (come nel tuo esempio)? –

+0

Raggruppamento. Nell'esempio 00:05, 00:10 e 00:15 è diventato 00:15 (sommerò i valori dei tre elementi e manterrò il timestamp di 00:15). – Fernando

risposta

7

Qualcosa di simile?

 DateTime[] dateTimes = new[] 
            { 
             new DateTime(2010, 8, 24, 0, 5, 0), 
             new DateTime(2010, 8, 24, 0, 10, 0), 
             new DateTime(2010, 8, 24, 0, 15, 0), 
             new DateTime(2010, 8, 24, 0, 20, 0), 
             new DateTime(2010, 8, 24, 0, 25, 0), 
             new DateTime(2010, 8, 24, 0, 30, 0) 
            }; 
     TimeSpan interval = new TimeSpan(0, 15, 0);  // 15 minutes. 

     var groupedTimes = from dt in dateTimes 
          group dt by dt.Ticks/interval.Ticks 
          into g 
          select new {Begin = new DateTime(g.Key*interval.Ticks), Values = g.ToList()}; 

     foreach (var value in groupedTimes) 
     { 
      Console.WriteLine(value.Begin); 
      Console.WriteLine("\t{0}", String.Join(", ", value.Values)); 
     } 
0

Hai provato a raggruppare con un modulo?

testato pseudocodice flusso di coscienza segue:

data = items.GroupBy(t => t.TimeInterval % 15 == 0); 
1
data = items.GroupBy(t => (int)(t.DateTime.Minutes/interval))) 
+0

Funzionerà solo se l'intervallo è inferiore a 60 minuti. – driis

Problemi correlati