Reputation: 6199
I have collection of TimeSpans, they represent time spent doing a task. Now I would like to find the average time spent on that task. It should be easy but for some reason I'm not getting the correct average.
Here's my code:
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());
}
Upvotes: 61
Views: 31331
Reputation: 38179
You can use the Average overload that takes a collection of long in parameter:
double doubleAverageTicks = sourceList.Average(timeSpan => timeSpan.Ticks);
long longAverageTicks = Convert.ToInt64(doubleAverageTicks);
return new TimeSpan(longAverageTicks);
Upvotes: 109
Reputation: 38220
In Addition to the above answer, I would suggest you take an average on the Seconds or MilliSeconds level (depending on what you require)
sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds)
Now using this value you could arrive at the new TimeSpan using
TimeSpan avg = TimeSpan.FromMilliseconds(double value here)
Upvotes: 4
Reputation: 32438
var average = new TimeSpan(sourceList.Select(ts => ts.Ticks).Average());
Note, your method returns a Nullable, but doesn't need to, unless you want to return null if the source list is empty, in which case just do a separate check first.
Upvotes: 12