2017-11-22 14 views
1

私は開始日と終了日と特定の日付(休日)のリストを持っています。 開始日から終了日までは、最初に週末があるかどうかを判断します。週末が何日あるかを判断し、終了日までの日数を追加する必要があります。休日リストの日付のリストに含まれています。再び、休日リストに日付がある場合は、その日数をかけて最後に追加して、ループをもう一度実行する必要があります。ループ内のDateTimesの範囲の比較

たとえば、初期の日付範囲は2011年11月20日から2011年11月24日までです。週末の最初のチェックでは0が返され、次に2(23日と24日)を返す休日をチェックすると、新しい範囲が11/20から11/26になるように日付を調整する必要があります。私は再び週末にループしなければならず、2日間は週末にあることがわかります。私が知っているので、以下のコードは私が気をつけたものです.2つ以上の休日があることは分かっていませんが、非常に面倒なコードです。

また、最初の週末を調整した後は、週末が最初に来てから休日が来るかどうかを検討してください。

私はちょうど週末に問題はありません、私は間違った値を与えられている休日のためだけです。下のコードはうまくいきますが、私はそれをどのように改善できるかについての提案を見たいと思っています。私はループのために試してきましたが、ループはこれが唯一のシナリオです。ご協力いただきありがとうございます。

public static int weekends(DateTime start, DateTime end, List<DateTime> holidays, Boolean leftSpace) 
    { 
     int days = 0; 

     DateTime tempstart = start; 
     TimeSpan startEnd = end - start; 
     int currentDays = startEnd.Days; 
     for (DateTime date = start; date <= end; date = date.AddDays(1)) 
     { 
      int dw = (int)date.DayOfWeek; 
      if (dw == 0 || dw == 6) 
      { 
       days++; 
      } 

     } 

     if (!leftSpace) 
     { 
      end = end.AddDays(days); 
      if (end.DayOfWeek == 0) 
      { 
       end = end.AddDays(1); 
       days++; 
      } 
      else if ((int)end.DayOfWeek == 6) 
      { 
       end = end.AddDays(2); 
       days = days + 2; 
      } 
      Boolean holidayExist = false; 
      int holidayCount = 0; 
      foreach (DateTime holiday in holidays.Where(r => r.Date >= start.Date && r.Date <= end.Date)) 
      { 
       days++; 
       holidayCount++; 
       holidayExist = true; 
      } 
      if (holidayExist) 
      { 
       DateTime tempend = end; 
       end = end.AddDays(holidayCount); 
       int newWeekend = 0; 
       for (DateTime date = tempend; date <= end; date = date.AddDays(1)) 
       { 
        int dw = (int)date.DayOfWeek; 
        if (dw == 0 || dw == 6) 
        { 
         days++; 
         newWeekend++; 
        } 

       } 
       holidayExist = false; 
       holidayCount = 0; 
       DateTime holidayEnd = end.AddDays(newWeekend); 
       foreach (DateTime holiday in holidays.Where(r => r.Date >= end.Date && r.Date <= holidayEnd.Date)) 
       { 
        days++; 
        holidayCount++; 
        holidayExist = true; 
       } 
       if (holidayExist) 
       { 
        tempend = end; 
        end = end.AddDays(holidayCount); 
        for (DateTime date = tempend; date <= end; date = date.AddDays(1)) 
        { 
         int dw = (int)date.DayOfWeek; 
         if (dw == 0 || dw == 6) 
         { 
          days++; 
         } 

        } 
       } 
      } 
     } 
     return days; 
    } 
+1

は、あなたが意図したとおり、このコードは動作しませんので、私はそれに対してアドバイスしたいコードレビューへ – BugFinder

+0

@BugFinderこれを取ることを示唆しています。 [ヘルプセンター](https://codereview.stackexchange.com/help/on-topic)をご覧ください。 – Mast

+0

@mast - 彼はそれがうまくいったと言った! – BugFinder

答えて

0

パフォーマンスに関してはこれをテストしていませんが、動作します。リストの休日は、休暇としてスキップされている日付のリストです。

public static int weekends(DateTime start, DateTime end, List<DateTime> holidays) 
    { 
     int days = 0; 

     DateTime tempEnd = end; 
     TimeSpan startEnd = end - start; 
     int currentDays = startEnd.Days; 

      int exclusionDays = 0; 
      int exclWEOld = 0; 
      int exclHDOld = 0; 
      while (currentDays >= 0) 
      { 
       int excHolidayTest = exclHolidays(start, tempEnd, holidays); 
       int excDayTest = exclDays(start, tempEnd); 
       if (exclusionDays == (excDayTest+ excHolidayTest)) 
       { 
        break; 
       } 
       else 
       { 
        exclusionDays = excDayTest + excHolidayTest; 
        if (exclWEOld == 0 && exclHDOld == 0) 
        { 
         tempEnd = tempEnd.AddDays((excDayTest + excHolidayTest)); 
        } 
        else 
        { 
         tempEnd = tempEnd.AddDays((excDayTest - exclWEOld)); 
         tempEnd = tempEnd.AddDays((excHolidayTest - exclHDOld)); 
        } 
        exclWEOld = excDayTest; 
        exclHDOld = excHolidayTest; 

       } 
       days = excDayTest + excHolidayTest; 
       currentDays--; 
      } 



     return days; 
    } 
    public static int exclDays(DateTime start, DateTime end) 
    { 
     int exclusionDays = 0; 
     for (DateTime date = start; date <= end; date = date.AddDays(1)) 
     { 
      int dw = (int)date.DayOfWeek; 
      if (dw == 0 || dw == 6) 
      { 
       exclusionDays++; 
      } 

     } 
     return exclusionDays; 
    } 
    public static int exclHolidays(DateTime start, DateTime end, List<DateTime> holidays) 
    { 
     int exclusionHolidays = 0; 

     foreach (DateTime holiday in holidays.Where(r => r.Date >= start.Date && r.Date <= end.Date)) 
     { 
      exclusionHolidays++; 
     } 

     return exclusionHolidays; 
    } 
関連する問題