gpt4 book ai didi

c# - 使用 LINQ 查找重叠的时间段(事件)

转载 作者:太空狗 更新时间:2023-10-29 18:35:16 24 4
gpt4 key购买 nike

我有一个事件列表,现在我想找出哪些事件重叠。下面是我目前拥有的代码,但我遇到的问题是搜索的项目也包含在列表中。

List<SomeEventObject> overlappingEvents = new List<SomeEventObject>();
foreach (SomeEventObject eventItem in EventList)
{
bool overlapping = false;
foreach (SomeEventObject anotherEventItem in EventList)
{
if (eventItem.StartDate <= anotherEventItem.EndDate &&
eventItem.EndDate >= anotherEventItem.StartDate)
{
overlapping = true;
overlappingEvents.Add(anotherEventItem);
}
}

if (overlapping)
overlappingEvents.Add(eventItem);
}

我需要创建一个没有搜索项目的新列表。因此我想问是否有一个很好的 LINQ 表达式可以为我处理这个问题。这是我想到的一些伪代码:

EventList.Where(e => 
eventItem.StartDate <= e.EndDate &&
eventItem.EndDate >= e.StartDate);

在这种情况下 eventItem 当然不存在。

因此,我认为我需要两个列表:一个具有重叠事件,一个具有非重叠事件。但是如果我有重叠的事件列表,那应该可以用 .Except() 实现。

编辑:

我创建了一个 dotnetfiddle这样就可以玩了。一个重要的问题是重叠算法。

事件 1:
开始日期:今天,10:00
结束日期:今天,10:05

事件 2:
开始日期:今天,10:05
结束日期:今天,10:10

如果您将其呈现给用户,则这不会重叠。所以我必须修改我的算法。

最佳答案

我会这样做:

var overlappingEvents =
(
from e1 in EventList
from e2 in EventList
where e1 != e2
where e1.StartDate <= e2.EndDate
where e1.EndDate >= e2.StartDate
from e in new [] { e1, e2 }
select e
).ToList();

我认为这应该很简单。


根据评论,此版本仅返回 EventList元素一次,无论它参与了多少重叠。

var overlappingEvents =
(
from e1 in EventList
where EventList
.Where(e2 => e1 != e2)
.Where(e2 => e1.StartDate <= e2.EndDate)
.Where(e2 => e1.EndDate >= e2.StartDate)
.Any()
select e1
).ToList();

也可以写成:

var overlappingEvents =
EventList
.Where(e1 =>
EventList
.Where(e2 => e1 != e2)
.Where(e2 => e1.StartDate <= e2.EndDate)
.Where(e2 => e1.EndDate >= e2.StartDate)
.Any())
.ToList();

根据进一步的评论,以下是配对事件的方法:

var overlappingEvents =
(
from e1 in EventList
from e2 in EventList
where e1 != e2
where e1.StartDate <= e2.EndDate
where e1.EndDate >= e2.StartDate
select new [] { e1, e2 }
).ToList();

现在overlappingEvents是数组列表 - List<SomeEventObject[]>而不是 List<SomeEventObject> .该数组包含重叠事件。

关于c# - 使用 LINQ 查找重叠的时间段(事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30459705/

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