Files
kreta/Kreta.BusinessLogic/HelperClasses/OsztalyCsoportbaSorolas/BesorolasDateRangeUtil.cs
2024-03-13 00:33:46 +01:00

98 lines
3.6 KiB
C#

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<BesorolasDateRange> 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<BesorolasDateRange> 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<DateTime> CreateDateList(DateTime begin, DateTime end)
{
return Enumerable.Range(0, end.Subtract(begin).Days).Select(d => begin.AddDays(d));
}
private static IEnumerable<BesorolasDateRange> GetOverlappedRanges(DateTime examinedDate, IEnumerable<BesorolasDateRange> 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;
}
}
}