3

異なるシフトで 1 日 24 時間働くさまざまなグループがある場合 (たとえば、あるグループは 8 時間シフトを 3 回、別のグループは 12 時間シフトを 2 回、最後のグループは 10 時間シフトを 2 回、4 時間は無人で働いているとします)。時間内に、最も最近開始されたシフトを返すための最も簡単な方法は何ですか?

一例として、8 時間Shiftの List があります (BeginTime はそれぞれ午前 6 時、午後 2 時、午後 10 時です)。

 public class Shift
    {
        public string Name { get; set; }
        public TimeSpan BeginTime { get; set; }
        public int LengthHours { get; set; }
    }

私の現在のコードは(私の目的のために)機能しますが、startTimeが必要であり、コレクション内でシフトが順番に行われるため、理想的ではありません。

public Shift FindCurrentShift(DateTime startTime, DateTime endTime, List<Shift> shifts)
{
    Shift mostRecentShift = null;
    foreach (Shift aShift in shifts) {
        DateTime shiftBeginTime = DateTime.Parse(endTime.Date.Add(aShift.BeginTime).ToString());
        if (startTime.Date != endTime.Date) {
            if (shiftBeginTime.TimeOfDay > startTime.TimeOfDay) {
                shiftBeginTime = shiftBeginTime.AddDays(-1);
            }
        }
        //does this shift fall in between start and stop time
        if ((startTime < shiftBeginTime && endTime > shiftBeginTime)) {
            mostRecentShift = aShift;
        }
    }
    return mostRecentShift;
}

現在の時間を考えると、私はどのシフトにいますか? これを行うためのより簡単な方法は何ですか?

4

5 に答える 5

0

これは古典的な最大値を求める問題です。そうである場合、または調べているシフトが最近開始されたmostRecentShift場合にのみ更新する必要があります。null現時点では、関係なく更新しています。

于 2013-10-16T21:42:53.467 に答える
0

私は C# の専門家ではなく、TimeSpan の型をよく理解していません。次の疑似コードは、BeginTime が 0 ~ 23 の整数値の範囲であると単純に考える場合に機能する可能性があります。

Shift mostRecentShift = null;
foreach (Shift aShift in shifts) 
{
    Shift goodShift = null;
    if(aShift.BeginTime <= currentTime)
        if(aShift.BeginTime + aShift.LengthHours > currentTime)
            goodShift = aShift;
    else if(24 - aShift.BeginTime < aShift.LengthHours - currentTime)
        goodShift = aShift;

    if(goodShift != null)
    {
        if(mostRecentShift == null)
            mostRecentShift = goodShift;
        else if(mostRecentShift.BeginTime < goodShift.BeginTime)
            mostRecentShift = goodShift;
    }
}

8 時間シフト (BeginTime はそれぞれ午前 6 時、午後 2 時、午後 10 時) のリストが与えられた場合、このコードは午前 0:00 ~ 午前 5:59 を考慮します。

于 2013-10-16T22:21:03.127 に答える