如何计算C#

时间:2017-11-10 16:55:35

标签: c# datetimepicker timespan

我已经搜索过这个问题,但遗憾的是找不到合适的答案。

我想计算在10天内做某事的平均时间,我有10 datetimepicker的开始时间,10 datetimepicker每天的结束时间(总共20 { {1}})。

现在我想得到这10天工作所花费的平均时间。

这是我在每天计算datetimepicker所做的工作,现在我不知道如何计算平均值timespan

当然我想知道有没有更短的方法来完成工作?

timespans

我想找到第1天到第10天的平均值

3 个答案:

答案 0 :(得分:10)

给定IEnumerable<TimeSpan>,您可以使用此扩展方法对其进行平均:

public static TimeSpan Average(this IEnumerable<TimeSpan> spans) => TimeSpan.FromSeconds(spans.Select(s => s.TotalSeconds).Average());

因此,请将结果转换为List

var durs = new List<TimeSpan>();
durs.Add(Dt11.TimeOfDay.Subtract(Dt1.TimeOfDay));
durs.Add(Dt12.TimeOfDay.Subtract(Dt2.TimeOfDay));
.
.
.

durs.Add(Dt20.TimeOfDay.Subtract(Dt10.TimeOfDay));

现在计算平均值:

var avgDurs = durs.Average();

PS:创建@ {MattJohnson的答案的Aggregate版本:

public static TimeSpan Mean(this IEnumerable<TimeSpan> source) => TimeSpan.FromTicks(source.Aggregate((m: 0L, r: 0L, n: source.Count()), (tm, s) => {
        var r = tm.r + s.Ticks % tm.n;
        return (tm.m + s.Ticks / tm.n + r / tm.n, r % tm.n, tm.n);
    }).m);

答案 1 :(得分:1)

您可以根据刻度数实例化新的TimeSpan来找到平均值。

    var time_spans = new List<TimeSpan>() { new TimeSpan(24, 10, 0), new TimeSpan(12, 0, 45), new TimeSpan(23, 30, 0), new TimeSpan(11, 34, 0) };

    var average = new TimeSpan(Convert.ToInt64(time_spans.Average(t => t.Ticks)));

     Console.WriteLine(average); 

结果17:48:41.2500000

答案 2 :(得分:1)

为了跟进NetMage的完美答案,请注意他的Average扩展方法正在使用.TotalSeconds,它返回整数秒和小数秒的double,精度为毫秒。如果你从时间选择器中获取值,这可能就好了,但在一般情况下,它会导致精度损失很小。

此外,处理大值时,TimeSpan.FromSeconds方法可能会溢出。即使不平均也可以重现:

TimeSpan.FromSeconds(TimeSpan.MaxValue.TotalSeconds)  // will throw an OverflowException
帕特里克霍夫曼在评论中提出了一个很好的观点,即从秒到蜱的转换也可能导致溢出,因此需要另一种解决方案。

采用this answer中给出的技术,我们可以使用arithmetic mean方法计算TimeSpan值集合的平均值,而不会丢失精度且不会溢出:

public static TimeSpan Mean(this ICollection<TimeSpan> source)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));

    long mean = 0L;
    long remainder = 0L;
    int n = source.Count;
    foreach (var item in source)
    {
        long ticks = item.Ticks;
        mean += ticks / n;
        remainder += ticks % n;
        mean += remainder / n;
        remainder %= n;
    }

    return TimeSpan.FromTicks(mean);
}

与其他扩展方法类似地使用它,例如:

TimeSpan average = mylistoftimespans.Mean();