2017-04-18 17 views
0

C#の機能に関する質問/回答を読み、作業日数を計算します(月曜日から金曜日までの日数)。拡張コードを使用するものもあります。C#特定の日付を除いた就業日の計算方法(祝日)

50,000行以上のデータテーブルがあり、この情報を計算するのに効果的な方法が必要でした。

+0

明確にするために - あなたはAの間、すべての休日を見つけるために探していますある年(その日から失われた時間を計算することができます)、または1年間の作業時間を探していますか? – confusedandamused

答えて

0
/// <summary> Get working days between two dates (Excluding a list of dates - Holidays) </summary> 
/// <param name="dtmCurrent">Current date time</param> 
/// <param name="dtmFinishDate">Finish date time</param> 
/// <param name="lstExcludedDates">List of dates to exclude (Holidays)</param> 
public static int fwGetWorkingDays(this DateTime dtmCurrent, DateTime dtmFinishDate, List<DateTime> lstExcludedDates) 
{ 
    Func<DateTime, bool> workDay = currentDate => 
      (
       currentDate.DayOfWeek == DayOfWeek.Saturday || 
       currentDate.DayOfWeek == DayOfWeek.Sunday || 
       lstExcludedDates.Exists(evalDate => evalDate.Date.Equals(currentDate.Date)) 
      ); 

    return Enumerable.Range(0, 1 + (dtmFinishDate - dtmCurrent).Days).Count(intDay => workDay(dtmCurrent.AddDays(intDay))); 
} 

私は基本的に2つの日付と(休日)を除外する日付のリストを受け取り、この拡張機能を作成しました。 驚くべきことに、このメソッドは非常に高速で、除外リストと比較してDateTimeから時刻を除外するための検証があります。 @MiBolsに基づいて

+0

「作業日」の定義は何かによって異なります。祝日は就業日とはみなされません。私はあなたがしたことをやります。私は、ソフトウェアが提供する特定の種類の組織について、今後数年間、毎年祝日のリストを保管しています。その公休日チェックをコードに追加すると、TRUEの労働日の計算機が得られます。 dbテーブルに将来10〜12行を入力するのに10分を費やすのは大きな負担ではありません。 –

1

は、より効率的なソリューションではなく、検索がO(1)に続いているList<DateTime>HashSet<DateTime>を使用するようになります答え:

/// <summary> Get working days between two dates (Excluding a list of dates - Holidays) </summary> 
/// <param name="dtmCurrent">Current date time</param> 
/// <param name="dtmFinishDate">Finish date time</param> 
/// <param name="excludedDates">Collection of dates to exclude (Holidays)</param> 
public static int fwGetWorkingDays(this DateTime dtmCurrent, DateTime dtmFinishDate, 
            HashSet<DateTime> excludedDates) 
{ 
    Func<DateTime, bool> workDay = currentDate => (
     currentDate.DayOfWeek == DayOfWeek.Saturday || 
     currentDate.DayOfWeek == DayOfWeek.Sunday || 
     excludedDates.Contains(currentDate.Date)); 

    return Enumerable.Range(0, 1 + (dtmFinishDate - dtmCurrent).Days) 
     .Count(intDay => workDay(dtmCurrent.AddDays(intDay))); 
} 
関連する問題