gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:46:17 26 4
gpt4 key购买 nike

我有一个代表员工可以工作的转变的类(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com