98 lines
3.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|