检测列表中日期重叠的算法

时间:2015-08-17 18:08:44

标签: c# performance date ienumerable

我有包含开始和结束日期的记录列表。我想知道哪些记录日期与其他记录日期重叠。下面是示例,记录5日期与记录3和4重叠。我该如何检查?

Dates

我浏览了link

我的问题是因为所有日期都在同一个列表中,我必须记录每条记录并与其他记录进行比较,我认为这是一个性能问题。

还有其他办法吗?比如使用Lambda?

2 个答案:

答案 0 :(得分:2)

如果您想使用LINQ - 您可以使用此变体。但说实话,for会在表现背景下给你更好的结果。例如here您可以在forLINQ之间找到一些比较,而不是LINQ

        var dates = new List<Tuple<DateTime, DateTime>>
                        {
                            new Tuple<DateTime, DateTime>(new DateTime(2001, 1, 1), new DateTime(2005, 1, 12)), 
                            new Tuple<DateTime, DateTime>(new DateTime(2006, 1, 1), new DateTime(2006, 4, 4)), 
                            new Tuple<DateTime, DateTime>(new DateTime(2007, 1, 5), new DateTime(2007, 10, 15)), 
                            new Tuple<DateTime, DateTime>(new DateTime(2009, 1, 2), new DateTime(2009, 4, 5)), 
                            new Tuple<DateTime, DateTime>(new DateTime(2007, 3, 3), new DateTime(2009, 5, 3))
                        };

        var overlaps = (from t1 in dates
                        from t2 in dates
                        where !Equals(t1, t2) // Don’t match the same object.
                        where t1.Item1 <= t2.Item2 && t1.Item2 >= t2.Item1   //check intersections
                        select t2).Distinct();

答案 1 :(得分:1)

您只需要在开始日期和结束日期对集合进行排序。完成后,您可以迭代集合,并为每个节点查看后续节点,直到找到不重叠的节点。

因此,如果您的数据集已经排序,则这是一个O(n)操作;如果它没有排序,则它是一个O(n * log(n))操作,它仍然明显优于每个节点与每个其他节点进行比较所需的O(n ^ 2)时间。