问题描述
我已经搜索过这个问题,但很遗憾找不到正确的答案.
I already search this question but unfortunately couldn't find proper answer.
我想计算在 10 个不同的日子里做某事的平均时间,我有 10 个 datetimepicker
作为开始时间,还有 10 个 datetimepicker
作为每个人的结束时间天(总共 20 个 datetimepicker
).
I want to calculate the average of time spent on doing something in 10 different day and I have 10 datetimepicker
for start time and also 10 datetimepicker
for end time for each day (in total 20 datetimepicker
).
现在我想获得这 10 天的平均工作时间.
now I want to get the average of time spent for work in these 10 days.
这是我每天为计算timespan
所做的,现在我不知道如何计算这些timespans
this is what I've done for calculating timespan
in each day and now I don't know how to calculate average if these timespans
当然我想知道有没有更短的方法来完成工作?
of course I want to know is there any shorter way to get the job done?
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()));
我想找到第 1 天到第 10 天的平均值
I want to find average of Day1 to Day10
推荐答案
给定一个 IEnumerable
你可以用这个扩展方法平均它们:
Given an IEnumerable<TimeSpan>
you can average them with this extension method:
public static TimeSpan Average(this IEnumerable<TimeSpan> spans) => TimeSpan.FromSeconds(spans.Select(s => s.TotalSeconds).Average());
因此,将您的结果转换为List
:
So, convert your results to a 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
版本:
PS: Created an Aggregate
version of @MattJohnson's answer:
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);
这篇关于如何计算C#中某些时间跨度的平均值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!