Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 时间范围的棘手Linq分组依据_C#_Linq_Datetime_Linq Group - Fatal编程技术网

C# 时间范围的棘手Linq分组依据

C# 时间范围的棘手Linq分组依据,c#,linq,datetime,linq-group,C#,Linq,Datetime,Linq Group,我有一个代表员工可以工作的班次的类: 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; 我的问题是:对于每天,我如何在不

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

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实现这一点。

首先,我认为如果您为每个班次提供一些唯一的标识符,以便您能够区分它,那么会更容易。然后我认为您可以使用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 );
    }
}
公共类移位{
公共int ID{get;set;}
公共日期时间开始{get;set;}
公共日期时间结束{get;set;}
公共DayOfWeek日{get;set;}
}
var query=shifts.Where(s1=>shifts.Any)(s2=>s1.ID!=s2.ID
&&s1.天==s2.天

&&(s2.谢谢tvanfosson,我忽略了每个班次都有唯一ID的事实,但他们确实有。让我编辑一下。
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 );
    }
}