查找 TimeSpan 集合的平均值
Posted
技术标签:
【中文标题】查找 TimeSpan 集合的平均值【英文标题】:Find average of collection of TimeSpans 【发布时间】:2012-02-09 11:39:31 【问题描述】:我收集了一些 TimeSpan,它们代表完成一项任务所花费的时间。现在我想找出花费在该任务上的平均时间。这应该很容易,但由于某种原因,我没有得到正确的平均值。
这是我的代码:
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());
【问题讨论】:
请提供样本数据以及您得到的结果以及您期望的结果。顺便说一句:订购不是必需的。 【参考方案1】:你可以使用Average overload,它需要一个long的集合:
double doubleAverageTicks = sourceList.Average(timeSpan => timeSpan.Ticks);
long longAverageTicks = Convert.ToInt64(doubleAverageTicks);
return new TimeSpan(longAverageTicks);
【讨论】:
这给了我一个错误:无法从 'double' 转换为 'long' 你也可以使用TotalSeconds
而不是Ticks,然后使用TimeSpan.FromSeconds
@V4Vendetta 是的,你可以,但你会失去亚秒组件,如果你正在计时短动作,这可能很有用
@vc74 好吧,在这种情况下,您可以拥有 TotalMilliseconds,在您的情况下,您也可以将两倍转换为 long,因此在这种情况下也会发生损失:)
@V4Vendetta 是的,但只计算一次平均值,这比每个时间跨度都要好。【参考方案2】:
var average = new TimeSpan(sourceList.Select(ts => ts.Ticks).Average());
注意,你的方法返回一个Nullable,但不需要,除非你想在源列表为空的情况下返回null,在这种情况下,只需先做一个单独的检查。
【讨论】:
没有返回long
值的 Enumerable.Average()
重载,也没有接受 double 作为参数的 TimeSpan 构造函数,因此该示例不适合我。为了使它编译,我不得不添加参数的显式转换(long)
:var average = new TimeSpan((long)sourceList.Select(ts => ts.Ticks).Average());
【参考方案3】:
除了上面的答案,我建议你取 Seconds 或 MilliSeconds 级别的平均值(取决于你的要求)
sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds)
现在使用此值,您可以使用
到达新的 TimeSpanTimeSpan avg = TimeSpan.FromMilliseconds(double value here)
【讨论】:
我只是想警告大家,如果你的平均值甚至不到一毫秒,那么由于some precision problems 你的新平均值TimeSpan
将始终为0。
@Artholl 这正是我的问题以上是关于查找 TimeSpan 集合的平均值的主要内容,如果未能解决你的问题,请参考以下文章