查找 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 =&gt; ts.Ticks).Average());【参考方案3】:

除了上面的答案,我建议你取 Seconds 或 MilliSeconds 级别的平均值(取决于你的要求)

sourceList.Average(timeSpan => timeSpan.ToTalMilliseconds)

现在使用此值,您可以使用

到达新的 TimeSpan
TimeSpan avg = TimeSpan.FromMilliseconds(double value here)

【讨论】:

我只是想警告大家,如果你的平均值甚至不到一毫秒,那么由于some precision problems 你的新平均值TimeSpan 将始终为0。 @Artholl 这正是我的问题

以上是关于查找 TimeSpan 集合的平均值的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中查找按日期分组的集合中的平均最低项

查找

(王道408考研数据结构)第七章查找-第一节:查找的基本概念平均查找长度

数据结构 第7章总结

平均查找长度可以是小数吗

数据结构 平均查找长度