2017-07-18 2 views
0

J'ai une liste d'objets Calendrier qui contiennent ParentId, StartDate et EndDate qui représentent des interruptions dans les quarts de travail. Il peut y avoir de nombreux quarts de travail dans une zone à n'importe quel moment, chacun avec des pauses différentes.Plage de dates croisées à partir d'une liste de dates

Je dois être en mesure d'obtenir la plage de dates où ils se croisent afin que je puisse déterminer quand personne ne travaille actuellement dans chaque zone.

Par exemple, si je les pauses de changement suivants:

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 }; 

alors le temps d'intersection que je dois revenir est 12:15:00 - 12:20:00 car c'est la seule fois que la zone n'a personne présent.

J'ai essayé avec la bibliothèque Time Period For .NET, mais cela me dit seulement que les intersections existent, et non pas la plage de l'intersection. Pour être clair, je ne veux pas savoir si les intersections ou chevauchements existent, j'ai besoin de connaître les gammes où ils se produisent.

enter image description here

+0

La meilleure façon est de trier par StartDate. Vous devriez vérifier quand personne ne travaille ce qui est quand row (x-1) EndDate jdweng

Répondre

0

Cela a fonctionné pour moi:

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 
     }); 

Il m'a donné:

intersection

+1

Réponse parfaite, vous avez sauvé mon bacon, merci beaucoup énigmativité. N'avait même pas considéré la fonction d'agrégat. Une solution aussi simple et élégante – StuartM