2017-07-18 6 views
0

仕事のシフトの中断を表すParentId、StartDate、EndDateを含むカレンダーオブジェクトのリストがあります。ある区域では、いつでも異なる休憩を取って多くのシフトが起こることがあります。日付のリストからの交互の日付範囲の返信

交差する日付範囲を取得して、現在各地域で作業中の人がいないときを判断できるようにする必要があります。例えば

、私は以下のシフト休憩している場合:

new Calendar { ParentId = 1, StartDate = 2017-06-18 11:50:00, EndDate = 2017-06-18 12:20:00 }; 
new Calendar { ParentId = 2, StartDate = 2017-06-18 12:10:00, EndDate = 2017-06-18 12:40:00 };  
new Calendar { ParentId = 3, StartDate = 2017-06-18 12:15:00, EndDate = 2017-06-18 12:45:00 }; 

を、私は返す必要が交差時間は12時15分00秒である - それはそれだけの時間であるとして、12時20分00秒エリアには誰もいません。

私はTime Period For .NETライブラリを試しましたが、交差点が存在するのではなく、交差点が存在することだけがわかります。

交差点や重複があるかどうかわかりませんが、発生する範囲を知る必要があります。

enter image description here

+0

最良の方法は、開始日でソートすることです。 row(x-1)EndDate jdweng

答えて

0

これは私の仕事:

var cals = new [] 
{ 
    new { ParentId = 1, StartDate = DateTime.Parse("2017-06-18 11:50:00"), EndDate = DateTime.Parse("2017-06-18 12:20:00") }, 
    new { ParentId = 2, StartDate = DateTime.Parse("2017-06-18 12:10:00"), EndDate = DateTime.Parse("2017-06-18 12:40:00") }, 
    new { ParentId = 3, StartDate = DateTime.Parse("2017-06-18 12:15:00"), EndDate = DateTime.Parse("2017-06-18 12:45:00") }, 
}; 

var intersection = 
    cals 
     .Aggregate((c0, c1) => new 
     { 
      ParentId = -1, 
      StartDate = c0.StartDate > c1.StartDate ? c0.StartDate : c1.StartDate, 
      EndDate = c0.EndDate < c1.EndDate ? c0.EndDate : c1.EndDate 
     }); 

をそれは私を与えた:

intersection

+1

完璧な答え、あなたは私のベーコンを保存しました、ありがとうございました。集計機能を考慮していない。そのようなシンプルな優雅な解決策 – StuartM