2015-12-24 25 views
0

我有一類名爲TimeRange和另一Interval雙方都相同的結構如下合併TimeRanges的兩個列表到一個

public class TimeRange 
{ 
    public TimeOfDay start{get; set;} 
    public TimeOfDay end{get; set;} 
} 

我有兩個列表

List<TimeRange> timeRanges = new List<TimeRange>(); 
timeRanges.Add(new TimeRange(Timespan.FromHours(5), Timespan.FromHours(6))); 
timeRanges.Add(new TimeRange(Timespan.FromHours(8), Timespan.FromHours(9))); 

List<Interval> interval = new List<Interval>(); 
interval.Add(new Interval(Timespan.FromHours(1), Timespan.FromHours(7))); 
interval.Add(new Interval(Timespan.FromHours(10), Timespan.FromHours(15))); 

我想這些列表合併成一個所以最終結果將包含此

Timespan.FromHours(1), Timespan.FromHours(5) 
Timespan.FromHours(5), Timespan.FromHours(6) 
Timespan.FromHours(6), Timespan.FromHours(7) 
Timespan.FromHours(8), Timespan.FromHours(9) 
Timespan.FromHours(10), Timespan.FromHours(15) 

另一個ca SE:

timeRange.Add(new Interval(TimeSpan.FromHours(9), TimeSpan.FromHours(17)) 
timeRange.Add(new Interval(TimeSpan.FromHours(17), TimeSpan.FromHours(19)) 

interval.Add(new Interval(TimeSpan.FromHours(0), TimeSpan.FromHours(4)) 
interval.Add(new Interval(TimeSpan.FromHours(4), TimeSpan.FromHours(5)) 
interval.Add(new Interval(TimeSpan.FromHours(5), TimeSpan.FromHours(9)) 
interval.Add(new Interval(TimeSpan.FromHours(9), TimeSpan.FromHours(10)) 
interval.Add(new Interval(TimeSpan.FromHours(12), TimeSpan.FromHours(13)) 

預期結果:

Timespan.FromHours(0), Timespan.FromHours(4) 
Timespan.FromHours(4), Timespan.FromHours(5) 
Timespan.FromHours(5), Timespan.FromHours(9) 
Timespan.FromHours(9), Timespan.FromHours(10) 
Timespan.FromHours(10), Timespan.FromHours(12) 
Timespan.FromHours(12), Timespan.FromHours(13) 
Timespan.FromHours(13), Timespan.FromHours(17) 
Timespan.FromHours(17), Timespan.FromHours(19) 
+0

有兩個班級做同樣工作的目的是什麼?爲什麼你需要將它們合併到一個列表中?你有什麼嘗試? –

+0

這兩個類在不同的域中表示不同。我必須合併它才能在最終列表中執行一些操作。我的問題是,一個列表可以有更多的元素,然後其他因此不知道哪一個循環? – King

+0

爲什麼你有5個新的範圍從4?爲什麼不是1-5,6-7,8-9,10-15?如果你想要每個子時間跨度,它也可以是1-5,5-6,6-7,7-8,8-9,9-10,10-15。你最終的邏輯究竟應該尋找最終5? – wentimo

回答

0

實現後,我在想我在來的做法應該在大多數情況下的工作方式不對這個問題。如果您遇到一些無效的數據,請將其提供給我,我會解決它。謝謝!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.CompilerServices; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      List<TimeRange> timeRanges = new List<TimeRange>(); 
      timeRanges.Add(new TimeRange(TimeSpan.FromHours(2), TimeSpan.FromHours(3))); 
      timeRanges.Add(new TimeRange(TimeSpan.FromHours(8), TimeSpan.FromHours(9))); 
      timeRanges.Add(new TimeRange(TimeSpan.FromHours(1), TimeSpan.FromHours(5))); 
      timeRanges.Add(new TimeRange(TimeSpan.FromHours(3), TimeSpan.FromHours(6))); 

      List<Interval> intervals = new List<Interval>(); 
      intervals.Add(new Interval(TimeSpan.FromHours(1), TimeSpan.FromHours(7))); 
      intervals.Add(new Interval(TimeSpan.FromHours(10), TimeSpan.FromHours(15))); 

      timeRanges.AddRange(intervals.Select(x => new TimeRange(x.start, x.end))); 

      timeRanges = TimeRange.ResolveOverlaps(timeRanges); 

      timeRanges.ForEach(x => Console.WriteLine($"{x.start} - {x.end}")); 
      Console.Read(); 
     } 
    } 

    public class TimeRange 
    { 
     public TimeSpan start { get; set; } 
     public TimeSpan end { get; set; } 

     public TimeRange(TimeSpan st, TimeSpan en) 
     { 
      start = st; 
      end = en; 
     } 

     public static List<TimeRange> ResolveOverlaps(List<TimeRange> timeRanges) 
     { 
      var times = new List<TimeSpan>(); 
      times.AddRange(timeRanges.Select(x => x.start)); 
      times.AddRange(timeRanges.Select(x => x.end)); 
      times = times.Distinct().OrderBy(x => x.Ticks).ToList(); 

      timeRanges.Clear(); 
      while (times.Count > 1) 
      { 
       timeRanges.Add(new TimeRange(times[0], times[1])); 
       times.RemoveAt(0); 
      } 

      return timeRanges; 
     } 

    } 

    public class Interval 
    { 
     public TimeSpan start { get; set; } 
     public TimeSpan end { get; set; } 

     public Interval(TimeSpan st, TimeSpan en) 
     { 
      start = st; 
      end = en; 
     } 
    } 
} 
+0

謝謝你的幫助。它在某些情況下起作用,然而,它在我擁有的新病例中突破。感謝您的幫助。 – King

+0

我將我的答案更新爲最強大的解決方案。讓我知道如果它仍然不適合你 – wentimo

+0

這種方法似乎沒有與我提到的第二種情況。它也限制TimeRange和Interval類只有兩個屬性成員。 – King