如何计算C#中某些时间跨度的平均值

Sar*_*niO 1 c# timespan datetimepicker

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

我想计算在不同的10天做某事的平均时间,我有10个datetimepicker开始时间,10个datetimepicker用于每天的结束时间(总共20个datetimepicker).

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

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

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

DateTime Dt1 = dateTimePicker1.Value;
DateTime Dt2 = dateTimePicker2.Value;
.
.
.
DateTime Dt20 = dateTimePicker20.Value;

TimeSpan Day1 = DateTime.Parse(Dt11.TimeOfDay.ToString()).Subtract(DateTime.Parse(Dt1.TimeOfDay.ToString()));
TimeSpan Day2 = DateTime.Parse(Dt12.TimeOfDay.ToString()).Subtract(DateTime.Parse(Dt2.TimeOfDay.ToString()));
.
.
.

TimeSpan Day10 = DateTime.Parse(Dt20.TimeOfDay.ToString()).Subtract(DateTime.Parse(Dt10.TimeOfDay.ToString()));
Run Code Online (Sandbox Code Playgroud)

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

Net*_*age 11

鉴于IEnumerable<TimeSpan>您可以使用此扩展方法对它们进行平均:

public static TimeSpan Average(this IEnumerable<TimeSpan> spans) => TimeSpan.FromSeconds(spans.Select(s => s.TotalSeconds).Average());
Run Code Online (Sandbox Code Playgroud)

因此,将结果转换为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));
Run Code Online (Sandbox Code Playgroud)

现在计算平均值:

var avgDurs = durs.Average();
Run Code Online (Sandbox Code Playgroud)

PS:创建Aggregate@ MattJohnson的答案:

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);
Run Code Online (Sandbox Code Playgroud)

  • 最好使用刻度而不是秒,以便不会以更精确的精度丢失任何信息.虽然在OP的情况下可能并不重要,但是来自一个选择器控件,如果要保持扩展方法,人们会希望它可以在各种场景中使用. (2认同)
  • 添加这个`using System.Linq;` (2认同)

Sai*_*aif 5

您可以通过基于刻度数实例化新的 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); 
Run Code Online (Sandbox Code Playgroud)

结果 17:48:41.2500000