C# 计算一周的总加班时间

C# 计算一周的总加班时间,c#,datetime,timespan,C#,Datetime,Timespan,有人能帮我吗,所以我想做一个方法,根据加班表计算每月每周的总小时数 readonly List<KeyValuePair<DateTime, TimeSpan>> overTimeList = new List<KeyValuePair<DateTime, TimeSpan>>();//the list of overtime hours, the data is printed below in the form of data {...} D

有人能帮我吗,所以我想做一个方法,根据加班表计算每月每周的总小时数

readonly List<KeyValuePair<DateTime, TimeSpan>> overTimeList = new List<KeyValuePair<DateTime, TimeSpan>>();//the list of overtime hours, the data is printed below in the form of data {...}

DateTime start = new DateTime(calendar1.CurrentDate.Year, calendar1.CurrentDate.Month, 1); //start (beginning of month in calendar)
DateTime stop = new DateTime(calendar1.CurrentDate.Year, calendar1.CurrentDate.Month, 1).AddMonths(1).AddDays(-1);//end (end of calendar month)
var weeksOverTimeSum = WeeklyOverTime(start, stop); //This is how I call the method
//method in which I want to get a certain list
private List<SundayWithWeekSum> WeeklyOverTime(DateTime startDate, DateTime stopDate)
        {
            var w = (int)startDate.DayOfWeek - 1;
            var result = from q in overTimeList
                         where q.Key >= startDate && q.Key <= stopDate
                         group q by (q.Key.Date.Day + w) / 7 into g
                         select new SundayWithWeekSum { Day = g.FirstOrDefault().Key, Balance = new TimeSpan(g.Sum(x => x.Value.Ticks)) };
                        //group q by(q.Key.Date.Day + (w == 0 ? w - 1 : w - 2)) / 7 into g
                        //select new SundayWithWeekSum { Day = g.FirstOrDefault().Key, Balance = new TimeSpan(g.Sum(x => x.Value.Ticks)) };
            return result.ToList();
        }

    class SundayWithWeekSum
    {
    public DateTime Day { get; set; }
    public TimeSpan Balance { get; set; }
    }

现在是在日历中显示工人的工作时间的时候了,现在,作为该方法的输入,我指定了一个特定月份的开始和结束时间,然后我想计算该月所有周的加班总量。你终于得到了SundayWithWeekSum列表,例如:

FirstWeek- 06/02/2019; +00.00, 
SecondWeek- 06/09/2019; 13.00, 
ThirdWeek- 16/06/2019; -1.47, 
FourthWeek- 06/23/2019; -00.27, 
FifthWeek- 06/30/2019; 1.12
这是我的代码的一个例子,我以为我已经度过了一个月,度过了每一天,为了在周日结束后休息,我在“balanceForWeeks”列表中为每周(每天)保存了总余额


谢谢大家的帮助。

这应该可以做到-

readonly List<KeyValuePair<DateTime, TimeSpan>> overTimeList = new List<KeyValuePair<DateTime, TimeSpan>>();
private List<SundayWithWeekSum> WeeklyOverTime(DateTime startDate, DateTime stopDate)
{
     var w = (int)startDate.DayOfWeek - 1;
     var result = from q in overTimeList
                  where q.Key >= startDate && q.Key <= stopDate
                  group q by (q.Key.Date.Day + w) / 7 into g
                  select new SundayWithWeekSum { Day = g.FirstOrDefault().Key, Balance = new TimeSpan(g.Sum(x => x.Value.Ticks)) };
    return result.ToList();
}
readonly List overTimeList=new List();
私人列表周垂直时间(DateTime startDate、DateTime stopDate)
{
var w=(int)startDate.DayOfWeek-1;
var结果=来自overTimeList中的q
其中q.Key>=startDate&&q.Key x.Value.Ticks)};
返回result.ToList();
}
上述函数将返回
列表
,从星期日开始的一周以及一周的总持续时间。它包括开始日期和结束日期


如果我遗漏了什么,请告诉我。

您能否提供输入数据的解释(以及定义输入的C#可编译代码)?然后如何将输入转化为输出?然后输出是什么?@Enigmativity输入是该月开始的日期,在循环的while循环中,我每个月的每一天都在循环中。然后我想我正在查看一份加班清单(我已经每天都加班了),并且我将在本周结束前的所有天数的余额中添加,当它结束时,我保留该周的总小时数并输入该清单。这对我来说就足够了。在
while
循环中,您不需要增加
CurrentDate
。所以我认为这可能会永远循环。但我不是100%解释这两个循环的原因。@Mara-你能用有效的C代码提供输入吗?然后是输出应该是什么。现在这个问题还不够详细。@Enigmativity感谢您的帮助,我更正了我的问题(代码),输入了输入开始参数,为了邀请该方法,如果我收到了该周每周总小时数的结果(周日,05:00),那就太好了。嘿,谢谢您的帮助,这很好,只是因为这是一个问题,我认为从计算7的第一天开始的方法,下一个,有几个星期,例如,到周末只有3天,这意味着7月是这样,但6月到月底只有1.2天,这个方法应该总是在周末休息,如果你明白了吗?对不起,我无法理解。你能提供两个样本输入和预期输出吗。包括那些有边界条件的。现在是时候在日历中显示工人的工作时间了,现在,作为该方法的输入,我指定一个特定月份的开始和停止,然后我想计算该月所有周的加班总量。您最终获得了SundayWithWeekSum列表,例如:第一周-2019年2月6日+2019年9月6日第二周00时20分-2.00,第三周-2019年6月16日+00.05,四周-2019年6月23日-2019年6月30日第五周02:00-04.00看起来好多了,非常感谢!!!是否可以要求将此链接到星期日,我认为这部分=>每个星期日都在这里注册(这是该周的余额),如果星期日的余额为零,则订阅该星期日的余额为0。@Guarav,因此,例如,这些数据是为一周的每个第一天输入的,我希望它是该星期日的总和,例如,如果我们观察六月,我现在就有星期天;如果我没有数据将0设置为余额,则整个查询的结果为2019年6月2日,0;9/6/2019, -5; 16/6/2019, 10; 23/6/2019, -2; 30/6/2019, 3;
readonly List<KeyValuePair<DateTime, TimeSpan>> overTimeList = new List<KeyValuePair<DateTime, TimeSpan>>();
private List<SundayWithWeekSum> WeeklyOverTime(DateTime startDate, DateTime stopDate)
{
     var w = (int)startDate.DayOfWeek - 1;
     var result = from q in overTimeList
                  where q.Key >= startDate && q.Key <= stopDate
                  group q by (q.Key.Date.Day + w) / 7 into g
                  select new SundayWithWeekSum { Day = g.FirstOrDefault().Key, Balance = new TimeSpan(g.Sum(x => x.Value.Ticks)) };
    return result.ToList();
}