2017-04-05 50 views
1

我正在尝试计算时间相交的次数的最大值。在开始和结束时间列表中获取重叠时间的最大值

,我想从下面的代码示例需要应4.

共有8次是预期的结果,也有6个值,在总相交,一组4,和一组2.

我想得到的是交叉口的最大值,但不能让它工作。

这是现在的代码。

void Main() 
{ 
var times = new List<Times> { 
new Times 
     { 
      Start = DateTime.Now, 
      End = DateTime.Now.AddMinutes(10) 
     }, 
new Times 
     { 
      Start = DateTime.Now, 
      End = DateTime.Now.AddMinutes(10) 
     }, 
new Times 
     { 
      Start = DateTime.Now.AddMinutes(2), 
      End = DateTime.Now.AddMinutes(10) 
     }, 

new Times 
     { 
      Start = DateTime.Now.AddMinutes(15), 
      End = DateTime.Now.AddMinutes(35) 
     }, 
new Times 
     { 
      Start = DateTime.Now.AddMinutes(25), 
      End = DateTime.Now.AddMinutes(42) 
     }, 
new Times 
     { 
      Start = DateTime.Now.AddMinutes(43), 
      End = DateTime.Now.AddMinutes(50) 
     }, 
new Times 
     { 
      Start = DateTime.Now.AddMinutes(55), 
      End = DateTime.Now.AddMinutes(89) 
     }, 
new Times 
     { 
      Start = DateTime.Now.AddMinutes(2), 
      End = DateTime.Now.AddMinutes(12) 
     } 
}; 


times.OrderBy(x => x.Start); 

var overlappingEvents = 
         (
         from e1 in times 
         where times 
          .Where(e2 => e1 != e2) 
          .Where(e2 => e1.Start <= e2.End) 
          .Where(e2 => e1.End >= e2.Start) 
          .Any() 
         select e1).ToList(); 

overlappingEvents.OrderBy(x => x.Start); 
overlappingEvents.Distinct().OrderBy(x => x.Start); 
overlappingEvents.Distinct().OrderBy(x => x.Start).Count(); 

} 

public class Times 
{ 
public DateTime Start { get; set; } 
public DateTime End { get; set; } 
} 

这是时代的输出对象

Start    | End 

05/04/2017 08:38:57 | 05/04/2017 08:48:57 

05/04/2017 08:38:57 | 05/04/2017 08:48:57 

05/04/2017 08:40:57 | 05/04/2017 08:48:57 

05/04/2017 08:40:57 | 05/04/2017 08:50:57 

05/04/2017 08:53:57 | 05/04/2017 09:13:57 

05/04/2017 09:03:57 | 05/04/2017 09:20:57 

05/04/2017 09:21:57 | 05/04/2017 09:28:57 

05/04/2017 09:33:57 | 05/04/2017 10:07:57 

This is the output of the overlapping object (I have added the line where the intersect stops) 

Start    | End 

05/04/2017 08:38:57 | 05/04/2017 08:48:57 

05/04/2017 08:38:57 | 05/04/2017 08:48:57 

05/04/2017 08:40:57 | 05/04/2017 08:48:57 

05/04/2017 08:40:57 | 05/04/2017 08:50:57 


--------------------------------------- 

05/04/2017 08:53:57 | 05/04/2017 09:13:57 

05/04/2017 09:03:57 | 05/04/2017 09:20:57 

我会很感激,如果有人能帮助我得到的交点的最大值。

谢谢

回答

2

试试这个。假设两个区间至少有一个公共点(即矿石区间的开始等于另一个区间的结束),则两个区间重叠。

void Main() 
{ 
    var times = new List<Times> { 
    new Times 
     { 
      Start = DateTime.Now, 
      End = DateTime.Now.AddMinutes(10) 
     }, 
    new Times 
     { 
      Start = DateTime.Now, 
      End = DateTime.Now.AddMinutes(10) 
     }, 
    new Times 
     { 
      Start = DateTime.Now.AddMinutes(2), 
      End = DateTime.Now.AddMinutes(10) 
     }, 
    new Times 
     { 
      Start = DateTime.Now.AddMinutes(15), 
      End = DateTime.Now.AddMinutes(35) 
     }, 
    new Times 
     { 
      Start = DateTime.Now.AddMinutes(25), 
      End = DateTime.Now.AddMinutes(42) 
     }, 
    new Times 
     { 
      Start = DateTime.Now.AddMinutes(43), 
      End = DateTime.Now.AddMinutes(50) 
     }, 
    new Times 
     { 
      Start = DateTime.Now.AddMinutes(55), 
      End = DateTime.Now.AddMinutes(89) 
     }, 
    new Times 
     { 
      Start = DateTime.Now.AddMinutes(2), 
      End = DateTime.Now.AddMinutes(12) 
     } 
    }; 

    var overlaps = times.Select(t1 => times.Count(t2 => IsOverlapping(t1, t2))).Max(); 
} 

bool IsOverlapping(Times t1, Times t2) 
{ 
    if (t1.Start >= t2.Start && t1.Start <= t2.End) 
    { 
     return true; 
    } 

    if (t1.End >= t2.Start && t1.End <= t2.End) 
    { 
     return true; 
    } 

    if (t2.Start >= t1.Start && t2.Start <= t1.End) 
    { 
     return true; 
    } 

    if (t2.End >= t1.Start && t2.End <= t1.End) 
    { 
     return true; 
    } 

    return false; 
} 

public class Times 
{ 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
} 

IsOverlapping功能可以简化,如果你可以改变Times类:

bool IsOverlapping(Times t1, Times t2) 
{ 
    return t1.Contains(t2.Start) || t1.Contains(t2.End) || t2.Contains(t1.Start) || t2.Contains(t1.End); 
} 

public class Times 
{ 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 

    public bool Contains(DateTime date) 
    { 
     return date >= Start && date <= End; 
    } 
} 
+0

完美!谢谢 –

0

多了一个属性添加到类

public class Times 
    { 
     public DateTime Start { get; set; } 
     public DateTime End { get; set; } 
     public TimeSpan Gap { get; set; } 
    } 

计算的差距

times.OrderBy(x => x.Start); 

    for (int i = 0; i < times.Count-1; i++) 
    { 
     times[i].Gap = times[i+1].Start - times[i].End; 
    } 

    times.OrderByDescending(x => x.Gap); 
相关问题