我有包含开始和结束日期的记录列表。我想知道哪些记录日期与其他记录日期重叠。下面是示例,记录5日期与记录3和4重叠。我该如何检查?
我浏览了link。
我的问题是因为所有日期都在同一个列表中,我必须记录每条记录并与其他记录进行比较,我认为这是一个性能问题。
还有其他办法吗?比如使用Lambda?
答案 0 :(得分:2)
如果您想使用LINQ - 您可以使用此变体。但说实话,for
会在表现背景下给你更好的结果。例如here您可以在for
和LINQ
之间找到一些比较,而不是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)时间。