2017-05-03 47 views
2
一定時期內計算最大周加班

我的日曆正在與一類移,看起來像這樣:C#中的時間

public class Shift 
{ 
    public TimeSpan Start { get; private set; } //e.g. 08:00 
    public TimeSpan End { get; private set; } //e.g. 17:00 
    public DateTime Day { get; } //e.g. 23.3. 2015 
} 

Calendar類看起來是這樣的:

public class Calendar 
{ 
    public Shift[] ShiftsOfEmployee { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
    public Calendar(DateTime startDate, DateTime endDate) 
    { 
     StartDate = startDate; 
     EndDate = endDate; 
     ShiftsOfEmployee = new Shift[Length()]; 
    } 

    public int Length() 
    { 
     return (EndDate - StartDate).Days; 
    } 

    public void calculateMaximumOvertime() 
    { 
     //TODO 
    } 
} 

我是什麼現在想做的是calculateMaximumOvertime函數。我正在考慮通過計算週數(例如,int weeks = (EndDate - StartDate).TotalDays/7;),然後創建每週一個結果列表。然後通過ShiftsOfEmployee一天到一天,並將每個Shift(如果有的話,否則爲0)的值加到相應的星期。然後,我將不得不再次通過結果列表並選擇最大值。所有這些在我看來有點笨重,我在考慮是否有更好的方法來做到這一點?

回答

1

您可以將問題分爲兩部分:查找日曆周和計算總和。

您可以使用Calendar.GetWeekOfYear解決第一個問題。然後,您可以使用Linq以集合方式彙總數據。

DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo; 
var cal = dfi.Calendar; 

var shiftWeeks = from se in ShiftsOfEmployee 
       group se by cal.GetWeekOfYear(se.Day, dfi.CalendarWeekRule, dfi.FirstDayOfWeek) 
        into g 
       select new 
       { 
        WeekNumber = g.Key, 
        Units = g.Sum(s => Units(s.Start, s.End)) 
       }; 

var max = shiftWeeks.Max(wk => wk.Units); 

public static int Units(TimeSpan start, TimeSpan end) { ... } 

或者,如果你想每星期

var shiftWeeks = from se in ShiftsOfEmployee 
       group se by cal.GetWeekOfYear(se.Day, dfi.CalendarWeekRule, dfi.FirstDayOfWeek) 
        into g 
       select new 
       { 
        WeekNumber = g.Key, 
        Max = g.Max(s => Units(s.Start, s.End)) 
       }; 
0

如果日子的數量不是七分之一,那麼將日子分開這樣的日子將不會很好地工作。解決這個問題的一個更好的方法是將每個班次添加到列表中,並且每次添加班次時都會增加一個計數器,一旦達到7,創建另一個列表來表示您的下一週並重置計數器,然後繼續這樣做直到所有輪班已被添加到「周」。然後,您可以處理最長的加班時間。

public void calculateMaximumOvertime() 
{ 
    List<Shift[]> ShiftsByWeek = new List<Shift[]>(); 
    int count = 0; 
    Shift[] adder = new Shift[6]; 
    foreach (var shift in ShiftsOfEmployee) 
    { 
     adder.SetValue(shift, count); 
     count++; 
     if (count == 6) 
     { 
      Shift[] temp = new Shift[6]; 
      adder.CopyTo(temp, 0); 
      ShiftsByWeek.Add(temp); 
      Array.Clear(adder, 0 , adder.Length); 
      count = 0; 
     } 
    } 
} 

編輯:此方法不考慮一週的日子,但是當週以來的天是基於位置的,你可以設計自己的陣列代表與代表一週中的某一天各指數移動的一週,這樣

Week[0] = sunday 
Week[1] = monday 
Week[2] = tuesday 

等等。

+0

我需要有日曆周,即使他們不是整體的最大值。但是,你的計數週數是正確的。 – Dracke

+0

@Dracke將您的列表中剩餘的值設爲空 – RH6

+0

@Dracke pinging並更新了答案 – RH6