using System; using System.Collections.Generic; using System.Linq; namespace Kreta.BusinessLogic.HelperClasses.OsztalyCsoportbaSorolas { public static class BesorolasDateRangeUtil { public static BesorolasOverlapResult CalculateMaxOverlap(DateTime besorolasKezdete, DateTime besorolasVege, IEnumerable besorolasok) { var maxOverlapCount = 0; DateTime? maxOverlapBeginDate = null; int? maxOverlapOsztalyId = null; var dateList = CreateDateList(besorolasKezdete, besorolasVege); foreach (var date in dateList) { var overlappedRanges = GetOverlappedRanges(date, besorolasok); var overlapCount = overlappedRanges.Count(); if (overlapCount > maxOverlapCount) { maxOverlapCount = overlapCount; maxOverlapBeginDate = date; var overlappedBesorolas = overlappedRanges.FirstOrDefault(x => x.OsztalyCsoportId.HasValue); if (overlappedBesorolas != null) { maxOverlapOsztalyId = overlappedBesorolas.OsztalyCsoportId.Value; } } } return new BesorolasOverlapResult(maxOverlapCount, maxOverlapBeginDate, maxOverlapOsztalyId); } public static BesorolasOverlapResult CalculateMinOverlap(DateTime besorolasKezdete, DateTime besorolasVege, IEnumerable besorolasok) { var minOverlapCount = int.MaxValue; DateTime? minOverlapBeginDate = null; var dateList = CreateDateList(besorolasKezdete, besorolasVege); foreach (var date in dateList) { var overlappedRanges = GetOverlappedRanges(date, besorolasok); var overlapCount = overlappedRanges.Count(); if (overlapCount < minOverlapCount) { minOverlapCount = overlapCount; minOverlapBeginDate = date; } } return new BesorolasOverlapResult(minOverlapCount, minOverlapBeginDate); } private static IEnumerable CreateDateList(DateTime begin, DateTime end) { return Enumerable.Range(0, end.Subtract(begin).Days).Select(d => begin.AddDays(d)); } private static IEnumerable GetOverlappedRanges(DateTime examinedDate, IEnumerable ranges) { // NOTE: Ha egyszer a besorolás jobbról is zárt lesz, akkor az End-nél egyenlőséget is kell vizsgálni. return ranges.Where(r => r.Begin <= examinedDate && r.End > examinedDate); } } public class BesorolasDateRange { public DateTime Begin { get; set; } public DateTime End { get; set; } public int? OsztalyCsoportId { get; set; } } public class BesorolasOverlapResult { public int OverlapCount { get; private set; } public DateTime? OverlapBeginDate { get; private set; } public int? MaxOverlapOsztalyId { get; private set; } public BesorolasOverlapResult(int overlapCount, DateTime? overlapBeginDate) { OverlapCount = overlapCount; OverlapBeginDate = overlapBeginDate; } public BesorolasOverlapResult(int overlapCount, DateTime? overlapBeginDate, int? maxOverlapOsztalyId) { OverlapCount = overlapCount; OverlapBeginDate = overlapBeginDate; MaxOverlapOsztalyId = maxOverlapOsztalyId; } } }