Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算一周内没有循环的工作天数?_C#_Algorithm_Datetime - Fatal编程技术网

C# 计算一周内没有循环的工作天数?

C# 计算一周内没有循环的工作天数?,c#,algorithm,datetime,C#,Algorithm,Datetime,我需要计算给定结构的总工作天数,说明一周中的哪些天是工作的,以及从开始到现在的日期 我目前的算法是: protected int TotalWorkDays(DateTime From, DateTime dtTo,WorkedDays days) { int Days = 0; DayOfWeek DOW; for (DateTime curDate = From; curDate.Date <= dtTo.Date; curDat

我需要计算给定结构的总工作天数,说明一周中的哪些天是工作的,以及从开始到现在的日期

我目前的算法是:

protected int TotalWorkDays(DateTime From, DateTime dtTo,WorkedDays days)
    {
        int Days = 0;
        DayOfWeek DOW;
        for (DateTime curDate = From; curDate.Date <= dtTo.Date; curDate = curDate.AddDays(1))
        {
            DOW = curDate.DayOfWeek;
            if ((DOW == DayOfWeek.Sunday &  days.Sunday) |
                (DOW == DayOfWeek.Monday &  days.Monday) |
                (DOW == DayOfWeek.Tuesday &  days.Tuesday) |
                (DOW == DayOfWeek.Wednesday &  days.Wednesday) |
                (DOW == DayOfWeek.Thursday &  days.Thursday) |
                (DOW == DayOfWeek.Friday &  days.Friday) |
                (DOW == DayOfWeek.Saturday &  days.Saturday)
               )
            {
                Days += 1;
            }
        }
        return Days;
    }
protected int TotalWorkDays(DateTime From、DateTime dtTo、WorkedDays)
{
整数天=0;
周道指;

对于(DATE TimeDe==from;CurDel.DATE < P>)求出从日期到日期之间的周数(使用减法和除法)。然后乘以每周工作的天数。对结束情况做一些减法(从/到日期在一周中)。< /P> < P> HMMM……/P> 创建一个字典,从
DayOfWeek
int
,如果我没记错的话),到
bool
,然后

var DaysWorked = (from dayoffset in Enumerable.Range(0, (To - From).TotalDays)
                  where WorkingDays[From.AddDays(dayoffset).DayOfWeek]
                  select dayoffset).Count();
但效率不高!

看看这篇文章,它解释了如何在没有循环的情况下完成这项工作;)

编辑:以下是它使用的公式:

  • 以周为单位计算时间跨度的数量
  • 从周数中扣除第一周。W=W-1
  • 将周数乘以每周工作天数。 叫它D
  • 找出指定时间范围内的假期。称之为H
  • 计算第一周的天数,称之为SD
  • 计算一下上周的天数,艾德
  • 总结所有的日子。BD=D+SD+ED� H

  • 您可以利用一周中每七天重复一次的事实。以下是算法的基本概要:

  • 计算第一部分周的工作天数
  • 计算最后一周的工作天数
  • 计算整个周数在中间,乘以一周工作天数。
  • 将上述三个值相加
  • var workDays=newdayofweek[]{DayOfWeek.Monday,DayOfWeek.周二};
    var天数=总工作日(新日期时间(2005,1,12)、新日期时间(2005,3,15)、工作日);
    受保护的整数总工作日(DateTime开始、DateTime结束、DayOfWeek[]工作日)
    {
    var weeks=(整数)数学下限((结束-开始).TotalDays/7);
    var天数=周*工作日。长度;
    //计算剩余
    var d=开始添加天数(周*7);
    
    而(d您可以使用以下算法:

    • 计算开始一周的工作日(最多7次迭代)
    • 计算开始/结束和多周之间的周数以及工作日
    • 计算周末的工作日(最多7次迭代)
    该样本使用了


    @Jeff的可能重复-不是重复。这里的工作日是可配置的。但是如果你阅读了算法的工作原理,你就不需要循环。你所需要做的就是计算开始和结束周的工作日(如果是部分的话),其余的你可以计算出来,因为你知道你每周工作多少天基本上是@Mannimarco说,但是codeproject网站上的公式将是您尝试做的事情的一个良好开端
    var workDays = new DayOfWeek[]{ DayOfWeek.Monday, DayOfWeek.Tuesday};
    var days = TotalWorkDays(new DateTime(2005,1,12), new DateTime(2005,3,15), workDays);
    
    protected int TotalWorkDays(DateTime start, DateTime end, DayOfWeek[] workDays)
    {
        var weeks = (int)Math.Floor((end - start).TotalDays / 7); 
        var days = weeks * workDays.Length;
    
        //Calc rest
        var d = start.AddDays(weeks * 7);
        while (d <= end)
        {
            if(workDays.Contains(d.DayOfWeek)) 
                days++;
            d = d.AddDays(1);
    
        }   
        return days;
    }
    
    // ----------------------------------------------------------------------
    public int CountWorkingDays( DateTime start, DateTime end, IList<DayOfWeek> workingDays )
    {
      if ( workingDays.Count == 0 )
      {
        return 0;
      }
    
      Week startWeek = new Week( start );
      Week endWeek = new Week( end );
      int dayCount = 0;
    
      // start week
      DateTime currentDay = start.Date;
      while ( currentDay < startWeek.End )
      {
        if ( workingDays.Contains( currentDay.DayOfWeek ) )
        {
          dayCount++;
        }
        currentDay = currentDay.AddDays( 1 );
      }
    
      // between weeks
      DateDiff inBetweenWeekDiff = new DateDiff( startWeek.End, endWeek.Start );
      dayCount += inBetweenWeekDiff.Weeks * workingDays.Count;
    
      // end week
      currentDay = endWeek.Start.Date;
      while ( currentDay < end )
      {
        if ( workingDays.Contains( currentDay.DayOfWeek ) )
        {
          dayCount++;
        }
        currentDay = currentDay.AddDays( 1 );
      }
    
      return dayCount;
    } // CountWorkingDays
    
    // ----------------------------------------------------------------------
    public void CountWorkingDaysSample()
    {
      DayOfWeek[] workingDays = new [] { DayOfWeek.Monday, DayOfWeek.Tuesday };
      DateTime start = new DateTime( 2011, 3, 1 );
      DateTime end = new DateTime( 2011, 5, 1 );
      Console.WriteLine( "working days: {0}", CountWorkingDays( start, end, workingDays ) );
      // > working days: 19
    } // CountWorkingDaysSample