繁体   English   中英

确定日期列表中的重叠日期

[英]Determining Date Overlapping in a list of dates

我有一个项目列表,每个项目都有一个开始结束日期时间组件。

var myDates= new List<Tuple<DateTime, DateTime>>();

我用一些日期填写它。

现在我想遍历它们,看看其中是否有任何两个有重叠的日期响铃。 所以我这样做了:

var myOverlapList = (from start in myDates
                   from endDate in myDates
                   where !Equals(start, end)
                   where start.Item1 <= end.Item2 && start.Item2 >= end.Item1
                   select end);

的工作原理,当日期有重叠,例如1天背部和两个日期之间来回,但当两个日期的条目有相同的价值观这行不通的。
那么我如何修复我的代码或其他东西来实现这一目标。

where !Equals(startDate, endDate)

应该过滤掉相同日期元组的行实际上正在过滤掉任何重复项,因此任何匹配的时间跨度都不在选择范围内。 因此,您的查询将返回所有DateTime元组,这些元组与集合中的其他一些元组重叠,但只是唯一的。 如果元组在您的集合中多次遇到,您还想返回它们。您的问题实际上是您无法区分具有相同值的两个不同项目。 所以你需要一个鉴别器,因为你使用了一个列表,一个项目的索引很合适。 您可以将Tuple<DateTime, DateTime>集合转换为例如{int id, Tuple<DateTime, DateTime> range}对象

var datesWithId = dates.Select((d, i) => new {id = i, range = d});

然后像这样修改您的查询:

var anyOverlap = (from startDate in datesWithId
                  from endDate in datesWithId
                  where startDate.id!=endDate.id
                  && startDate.range.Item1 <= endDate.range.Item2
                  && startDate.range.Item2 >= endDate.range.Item1
                  select endDate.range).Distinct();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM