1

我有一个代表员工可以工作的班次的课程:

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

假设我有一个单一员工的轮班列表:

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 回答