2012-01-13 14 views
40

Mam kolekcję TimeSpans, które reprezentują czas spędzony na wykonaniu zadania. Teraz chciałbym znaleźć średni czas spędzony na tym zadaniu. To powinno być łatwe, ale z jakiegoś powodu nie otrzymuję właściwej średniej.Znajdź średnią kolekcji TimeSpans

Oto mój kod:

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

Proszę podać przykładowe dane i wynik, który otrzymujesz i jakiego oczekujesz rezultatu. BTW: Zamawianie nie jest konieczne. –

Odpowiedz

75

Można użyć Average overload że trwa zbieranie od dawna w parametrze.

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

return new TimeSpan(longAverageTicks); 
+0

@GeorgeDuckett Zauważyłem to i zmieniono na kleszcze, dzięki –

+1

+1, ponieważ nie myślałem, aby użyć przeciążenia 'Średnia'. –

+0

i +1 za odpowiedź, która działa również :) –

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

Uwaga, metoda zwraca Nullable, ale nie musi, jeśli nie chcesz, aby powrócić null, jeśli lista źródłowa jest pusty, w takim przypadku po prostu zrobić pierwszy oddzielny check .

3

oprócz powyższej odpowiedzi, chciałbym zaproponować Ci podjąć średnio na poziomie sekundach lub milisekundach (w zależności od tego, czego wymaga)

sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds) 

teraz za pomocą tej wartości można przyjechać na nowym TimeSpan przy użyciu

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

Chcę tylko ostrzec wszystkich, że jeśli twoja średnia nie wynosi nawet jednej milisekundy, niż z powodu [pewnych problemów precyzji] (http://stackoverflow.com/a/5450832/1108200) twoja nowa średnia 'TimeSpan' będzie zawsze 0 . – Artholl

+0

@Artholl To był mój dokładny problem – Coops