使用 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();
我希望使用 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();