2012-01-13 13 views
40

Ho una collezione di TimeSpan, rappresentano il tempo trascorso a svolgere un'attività. Ora vorrei trovare il tempo medio speso per questo compito. Dovrebbe essere facile, ma per qualche motivo non sto ottenendo la media corretta.Trova la media della collezione di TimeSpans

Ecco il mio codice:

private TimeSpan? GetTimeSpanAverage(List<TimeSpan> sourceList) 
{ 
    TimeSpan total = default(TimeSpan); 

    var sortedDates = sourceList.OrderBy(x => x); 

    foreach (var dateTime in sortedDates) 
    { 
     total += dateTime; 
    } 
    return TimeSpan.FromMilliseconds(total.TotalMilliseconds/sortedDates.Count()); 
} 
+0

Si prega di fornire dati di esempio e quale risultato si sta ottenendo e quale risultato ci si aspetta. BTW: l'ordine non è necessario. –

risposta

75

È possibile utilizzare il Average overload che prende una raccolta di lunga nel parametro.

double doubleAverageTicks = sourceList.Average(timeSpan => timeSpan.Ticks); 
long longAverageTicks = Convert.ToInt64(doubleAverageTicks); 

return new TimeSpan(longAverageTicks); 
+0

@GeorgeDuckett L'ho notato e cambiato in zecche, grazie –

+1

+1 perché non pensavo di utilizzare il sovraccarico di 'Media'. –

+0

e +1 per la risposta che funziona anche :) –

11
var average = new TimeSpan(sourceList.Select(ts => ts.Ticks).Average()); 

nota, il metodo restituisce un Nullable, ma non ha bisogno di, a meno che non si vuole restituire null se la lista sorgente è vuoto, nel qual caso basta fare un controllo separato prima .

3

In aggiunta alla risposta di cui sopra, vorrei suggerire di prendere una media del livello o più secondi millisecondi (a seconda di ciò che si richiede)

sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds) 

Ora, usando questo valore si potrebbe arrivare alla nuova TimeSpan utilizzando

TimeSpan avg = TimeSpan.FromMilliseconds(double value here) 
+1

Voglio solo avvertire tutti che se la tua media non è nemmeno di un millisecondo, a causa di [alcuni problemi di precisione] (http://stackoverflow.com/a/5450832/1108200) il tuo nuovo 'TimeSpan' medio sarà sempre 0 – Artholl

+0

@Artholl Questo era il mio problema esatto – Coops

Problemi correlati