使用 Linq 在日历上查找一天内发生的事件列表

Find list of events on calendar occurring within One Day using Linq

我希望使用 C# 和 Linq 查找特定日期发生的事件计数。如果任何活动在特定日期有时间,则该会议将包含在当天的记录中。

这是我的模型

public class Meeting
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

这里是一组数据

    public static List<Meeting> MockMeetings()
    {
        Meeting m1 = new Meeting { ID = 1, Name = "Meeting 7/21 2pm-3pm 7/21", Start = new DateTime(2020, 7, 21, 14, 0, 0), End = new DateTime(2020, 7, 21, 15, 0, 0) };
        Meeting m2 = new Meeting { ID = 2, Name = "Meeting 7/22 2pm-3pm ", Start = new DateTime(2020, 7, 22, 14, 0, 0), End = new DateTime(2020, 7, 22, 15, 0, 0) };            
        Meeting m3 = new Meeting { ID = 3, Name = "Meeting 7/22 2pm until 7/23 1am", Start = new DateTime(2020, 7, 22, 14, 0, 0), End = new DateTime(2020, 7, 23, 1, 0, 0) };
        Meeting m4 = new Meeting { ID = 4, Name = "Meeting 7/23 1am-2am", Start = new DateTime(2020, 7, 23, 1, 0, 0), End = new DateTime(2020, 7, 23, 2, 0, 0) };
        Meeting m5 = new Meeting { ID = 5, Name = "Meeting 7/22 1am until 7/25 1am", Start = new DateTime(2020, 7, 22, 1, 0, 0), End = new DateTime(2020, 7, 25, 1, 0, 0) };
        Meeting m6 = new Meeting { ID = 6, Name = "Meeting 7/24 11pm-almost midnight", Start = new DateTime(2020, 7, 24, 23, 0, 0), End = new DateTime(2020, 7, 24, 23, 59, 59) };
        Meeting m7 = new Meeting { ID = 7, Name = "Meeting 7/21 1am-2am", Start = new DateTime(2020, 7, 21, 1, 0, 0), End = new DateTime(2020, 7, 21, 2, 0, 0) };
        List<Meeting> meetings = new List<Meeting>();
        meetings.Add(m1); meetings.Add(m2); meetings.Add(m3); meetings.Add(m4); meetings.Add(m5); meetings.Add(m6); meetings.Add(m7);
        return meetings;
    }

在我的代码中,我循环遍历每个 ,其中 天值 是新的 DateTime(2020, 7, 21, 0, 0、0) 等。我很难弄清楚会议跨越多天。我正在尝试使用 Linq to SQL.

    public static IEnumerable<DateTime> EachDay(DateTime from, DateTime thru)
    {
        for (var day = from.Date; day.Date <= thru.Date; day = day.AddDays(1))
            yield return day;
    }



    DateTime from = new DateTime(2020, 7, 21);
    DateTime to = new DateTime(2020, 7, 25);

        foreach (DateTime day in Utility.EachDay(from, to))
        {
            List<Meeting> startOK = meetings.Where(p => p.Start >= day).Where(p => p.Start <= day.AddDays(1).AddMinutes(-1)).ToList();            
            List<Meeting> endOK = startOK.Where(p => p.End >= day).ToList();
            List<Meeting> bothOK = startOK.Union(endOK).DistinctBy(p=>p.ID).ToList();
        }

我希望使用 bothOK 实现的结果对于跨会议来说是错误的。这应该是正确答案:

7/21 会议 1、7

7/22 会议 2,3,5

7/23 会议 3,4,5

7/24 会议 5,6

7/25 会议 5

对于每一天,您需要确定会议是在当天开始,在当天结束,还是在当天完全重叠,因此有三种可能。请注意,您对 endOK 的测试仅包括当天开始的会议,不包括前一天开始的重叠会议。

    var startOK = meetings.Where(p => day <= p.Start && p.Start < day.AddDays(1)).ToList();
    var endOK = meetings.Where(p => day <= p.End && p.End <= day.AddDays(1)).ToList();
    var overlapOK = meetings.Where(p => p.Start <= day && day <= p.End).ToList();

    var allOK = startOK.Concat(endOK).Concat(overlapOK).DistinctBy(p => p.ID).ToList();