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

Pet*_*ter 5 .net c# vb.net

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

我们有几个涉及同一系统的高风险任务.下面我有三个名为HR1/2/3/4的示例作业,包括开始和结束日期/时间.

  • HR1 {1/6/2010 10:00 - 1/6/2010 15:00}
  • HR2 {1/6/2010 11:00 - 1/6/2010 18:00}
  • HR3 {1/6/2010 12:00 - 1/6/2010 14:00}
  • HR4 {1/6/2010 18:00 - 1/6/2010 20:00}

我想要的最终结果如下所示.我无法通过示例来描述它.

  • HRE1 {1/6/2010 10:00 - 1/6/2010 11:00} - 相交1
  • {结束时间分割1,仅为了可读性,在解决方案中不需要}
  • HRE1 {1/6/2010 11:00 - 1/6/2010 12:00} - 相交2
  • HRE2 {1/6/2010 11:00 - 1/6/2010 12:00} - 相交2
  • {结束时间分割2,仅为了可读性,在解决方案中不需要}
  • HRE1 {1/6/2010 12:00 - 1/6/2010 14:00} - 相交3
  • HRE2 {1/6/2010 12:00 - 1/6/2010 14:00} - 相交3
  • HRE3 {1/6/2010 12:00 - 1/6/2010 14:00} - 相交3
  • {结束时间分割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,仅为了可读性,在解决方案中不需要}
  • HRE2 {1/6/2010 15:00 - 1/6/2010 18:00} - 相交1
  • {结束时间分割5,仅为了可读性,在解决方案中不需要}
  • HR4 {1/6/2010 18:00 - 1/6/2010 20:00} - 相交1

任何帮助将不胜感激.

svi*_*ick 5

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 };
Run Code Online (Sandbox Code Playgroud)

编辑:修改交叉点的代码:

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
                    };
Run Code Online (Sandbox Code Playgroud)

我不知道你想对结果做什么,但最好是使用intersectionGroups而不是intersections.