2012-01-13 118 views
40

我收集了TimeSpans,它们代表了花在做任务上的时间。现在我想找出在这项任务上花费的平均时间。这应该很容易,但由于某种原因,我没有得到正确的平均值。查找TimeSpans收集的平均值

这里是我的代码:

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

请提供样本数据,您得到的结果和您期待的结果。顺便说一下:排序是没有必要的。 – 2012-01-13 08:22:52

回答

75

您可以使用参数需要长期收集的Average overload

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

return new TimeSpan(longAverageTicks); 
+0

@GeorgeDuckett我已经注意到它,并改为蜱虫,谢谢 – 2012-01-13 08:25:09

+1

+1,因为我没有想到使用“Average”的超载。 – 2012-01-13 08:27:40

+0

和+1为你的答案,这也是作品:) – 2012-01-13 08:30:13

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

注意,你的方法返回一个Nullable,但并不需要,除非你想返回null如果源列表为空,在这种情况下,只是做一个独立的检查第一。

3

除了上面的回答,我会建议你采取的秒或毫秒级的平均(取决于您所需要的)

sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds) 

现在使用这个值,你可以使用在新的时间跨度到达

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

我只是想警告大家,如果你的平均数不是一毫秒,而不是因为[一些精度问题](http://stackoverflow.com/a/5450832/1108200),你的新平均TimeSpan将始终为0 – Artholl 2015-10-29 12:44:33

+0

@Artholl这是我确切的问题 – Coops 2016-11-17 21:35:49