c# - Tricky Linq 按时间范围分组

标签 c# linq datetime linq-group

我有一个代表员工可以工作的转变的类(class):

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 来做到这一点。

最佳答案

首先,我认为如果您为每个类次分配一些唯一的标识符以便您可以区分它会更容易。然后我认为您可以使用 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 );
    }
}

关于c# - Tricky Linq 按时间范围分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/754546/

相关文章:

c# - 如何从枚举中选择随机值?

c# - 正则表达式匹配太多

用R中的有序数字替换纪元以来的秒数

python - pandas to_json - 以天而不是秒为单位返回时间戳

c# - SharePoint 网络服务 : Need to fetch list in a sub-site

c# - Linq 没有显示正确的数字

c# - 如何在 LINQ 中获取 "remainder"查询(所有非匹配对)并将其收集到列表中

c# - 使用 Linq 叠加/连接两个集合

python - 将给定日期后的日期时间转换为分钟

c# - 在 Team Build 中,自动构建使用 VB6 库的 C# 应用程序的最佳实践方法是什么?