1

従業員が働くことができるシフトを表すクラスがあります。

public class Shift {
    public int Id { get; set;}
    public DateTime Start {get;set;}
    public DateTime End { get; set;}
    public DayOfWeek Day { get; set;}
}

そして、1 人の従業員のこれらのシフトのリストがあるとします。

List<Shift> myShifts;

次のlinqステートメントを使用して、日ごとにシフトをグループ化できることを知っています。

var shiftsByDay = from a in myShift
                  group a by a.Day;

私の質問:毎日、重複するすべてのシフトを別々のグループで、二重にカウントせずに取得するにはどうすればよいですか?

重複シフトとは、開始時刻または終了時刻が別のシフトの開始時刻または終了時刻と重複するシフトです。

可能であれば、linqでこれを実行できるようになりたいです。

4

1 に答える 1

3

まず、各シフトに一意の識別子を付けて区別できるようにすると、より簡単になると思います。次に、 Where を使用して、コレクション内の別の要素と競合する各要素を選択できると思います。最後に、それらを日ごとにグループ化できます。これは、どのシフトが競合しているかを示しているわけではなく、特定の日に競合しているシフトだけを示していることに注意してください。

public class Shift {
    public int ID { get; set; }
    public DateTime Start {get;set;}
    public DateTime End { get; set;}
    public DayOfWeek Day { get; set;}
}

var query = shifts.Where( s1 => shifts.Any( s2 => s1.ID != s2.ID
                                        && s1.Day == s2.Day
                                        && (s2.Start <= s1.Start && s1.Start <= s2.End)
                                             || (s1.Start <= s2.Start && s2.Start <= s1.End))
                  .GroupBy( s => s.Day );

foreach (var group in query.OrderBy( g => g.Key ))
{
    Console.WriteLine( group.Key ); // Day of Week
    foreach (var shift in group)
    {
         Console.WriteLine( "\t" + shift.ID );
    }
}
于 2009-04-16T03:30:56.470 に答える