【问题标题】:Find average of collection of TimeSpans查找 TimeSpan 集合的平均值
【发布时间】: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());
}

【问题讨论】:

  • 请提供样本数据以及您得到的结果以及您期望的结果。顺便说一句:订购不是必需的。

标签: c# average timespan


【解决方案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 这正是我的问题
猜你喜欢
  • 2021-12-22
  • 2014-10-21
  • 2020-08-10
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 2018-07-12
  • 2012-02-20
相关资源
最近更新 更多