init
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user