如何计算C#中某些时间跨度的平均值 [英] How to calculate average of some timespans in C#

查看:66
本文介绍了如何计算C#中某些时间跨度的平均值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经搜索过这个问题,但很遗憾找不到正确的答案.

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#中某些时间跨度的平均值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆