代码之家  ›  专栏  ›  技术社区  ›  Peter

计算多个日期/时间范围之间的交叉点位置和数量?

  •  5
  • Peter  · 技术社区  · 16 年前

    我需要计算多个日期范围之间交叉点的位置,以及重叠交叉点的数量。然后我需要显示哪些日期/时间范围与这些相交部分重叠。它比这稍微复杂一些,所以我会尽我所能通过提供一个例子来解释。我在VB.Net中工作,但C示例是可以接受的,我在这两种语言中都工作过。

    我们有几个涉及同一系统的高风险任务。下面我有三个例子工作命名为HR1/2/3/4与开始和结束日期/时间。

    • HR2{2010年1月6日11:00-2010年1月6日18:00}
    • HR3{2010年1月6日12:00-2010年1月6日14:00}
    • HR4{2010年1月6日18:00-2010年1月6日20:00}

    我希望最终结果如下所示。除了举例,我很难用任何方式来描述它。

    • HRE1{1/6/2010 10:00-1/6/2010 11:00}-交叉点1
    • HRE1{1/6/2010 11:00-1/6/2010 12:00}-交叉点2
    • {结束时间分割2,仅用于可读性,解决方案中不需要}
    • {结束时间分割3,仅用于可读性,解决方案中不需要}
    • HRE1{1/6/2010 14:00-1/6/2010 15:00}-交叉点2
    • HRE2{1/6/2010 14:00-1/6/2010 15:00}-交叉点2
    • {结束时间分割4,仅用于可读性,解决方案中不需要}
    • {结束时间分割5,仅用于可读性,解决方案中不需要}
    • HR4{1/6/2010 18:00-1/6/2010 20:00}-交叉点1

    任何帮助都将不胜感激。

    1 回复  |  直到 16 年前
        1
  •  5
  •   svick Raja Nadar    16 年前
    var timePoints = (from r in ranges select r.Start)
        .Concat(from r in ranges select r.End)
        .Distinct().OrderBy(dt => dt).ToArray();
    
    var intersections = from i in Enumerable.Range(0, timePoints.Length - 1)
                        let start = timePoints[i]
                        let end = timePoints[i + 1]
                        from range in ranges
                        where range.Start <= start && range.End >= end
                        select new { Range = range, Start = start, End = end };
    

    编辑:

    var timePoints = (from r in ranges select r.Start)
        .Concat(from r in ranges select r.End)
        .Distinct().OrderBy(dt => dt).ToArray();
    
    var intersectionGroups = from i in Enumerable.Range(0, timePoints.Length - 1)
                             let start = timePoints[i]
                             let end = timePoints[i + 1]
                             select new
                             {
                                 Start = start,
                                 End = end,
                                 Ranges =
                                     from range in ranges
                                     where range.Start <= start && range.End >= end
                                     select range
                             };
    
    var intersections = from intGroup in intersectionGroups
                        let count = intGroup.Ranges.Count()
                        from range in intGroup.Ranges
                        select new
                        {
                            Range = range,
                            Start = intGroup.Start,
                            End = intGroup.End,
                            Count = count
                        };
    

    我不知道你想用这个结果做什么,但用它可能更好 intersectionGroups 而不是 intersections .

    推荐文章