시간 간격 표현을 약간 변경하고 EndTime 대신 Length 속성을 사용하는 것이 좋습니다.
class TimeInterval
{
public int Day { set; get; }
public DateTime StartTime { set; get; }
public int Length { set; get; }
}
겹치는 간격을 찾는 데 관심이 있으니 다음 방법을 사용하면 편리합니다. 나는 이것을 TimeInterval 클래스 안에 넣을 것입니다.
public int StartMinuteInWeek()
{
return Day * 24 * 60 + StartTime.Hour * 60 + StartTime.Minute;
}
public int EndMinuteInWeek()
{
return StartMinuteInWeek() + Length;
}
그러면 새로운 시간 간격과 겹치는 모든 TimeInterval을 찾아야합니다. 새로운 간격은 기존의 간격을 확장하거나 두 개의 개별 간격을 결합하거나 이미 정의 된 간격에 포함될 수 있음을 알아야합니다.
은 간격의 시작에 중복 레코드를 얻을 다음 쿼리를 사용하려면
var startOverlap = (from rec in intervals
where rec.StartMinuteInWeek() <= timeInterval.StartMinuteInWeek() && rec.EndMinuteInWeek() >= timeInterval.StartMinuteInWeek()
select rec).FirstOrDefault();
timeInterval
가 추가하려는 새로운 간격입니다. startOverlap가 널이면
var endOverlap = (from rec in intervals
where rec.StartMinuteInWeek() <= timeInterval.EndMinuteInWeek() && rec.EndMinuteInWeek() >= timeInterval.EndMinuteInWeek()
select rec).FirstOrDefault();
이 다음 구간의 시작에서 중첩이 없다 : 단부 대
는 한 다음 사용 중첩된다. endOverlap에서도 마찬가지입니다. startOverlap == endOverlap 인 경우, 새 간격은 이미 존재하는 간격 안에 완전히 포함됩니다.
StartTime을 DateTime 유형으로 정의했는데 시간 부분에만 관심이 있지만 Hour 및 Minute라는 두 개의 필드 또는 시작 분을 나타내는 유일한 필드가 필요한 경우이 값을 변경할 수 있습니다 그 간격의 주에
나는 내 댓글에서 언급 한 바와 같이 편집
, 나는 새로운 시간 간격이 몇 이미 정의 된 간격을 겹칠 수 있음을 깨달았다.예를 들어 정상적으로 작업이 8:00에서 20:00에 진행되고 점심 시간에 중지하고 24x7 주 내내 통과하는 새 시간 간격이 정의되면 새 시간 간격에 14 개의 간격이 포함됩니다.
이것을 통과하는 안전한 방법은 먼저 모든 겹쳐진 간격을 감지 한 다음 새 간격을 조정하여 겹쳐진 간격을 완전히 포함하고 마지막으로 모든 겹침을 삭제하는 것입니다.
새 간격이 이전 간격과 겹치는 지 알아 보려면 TimeInterval 클래스에서이 편리한 방법을 정의하겠습니다.
public bool IsInsideInterval(int minuteInWeek)
{
return minuteInWeek >= StartMinuteInWeek() &&
minuteInWeek <= EndMinuteInWeek();
}
이제 시작 간격 또는 종료 분이 새 간격 안에 있음을 알 수 있습니다.
var overlaps = (from rec in intervals where
newInterval.IsInsideInterval(rec.StartMinuteInWeek()) ||
newInterval.IsInsideInterval(rec.EndMinuteInWeek())
select rec).ToList();
이제 새 간격 제한이 올바른지 확인해야합니다.
foreach (TimeInterval rec in overlaps)
{
if (rec.StartMinuteInWeek() < newInterval.StartMinuteInWeek())
{
newInterval.Day = rec.Day;
newInterval.StartTime = rec.StartTime;
}
if (rec.EndMinuteInWeek() > newInterval.EndMinuteInWeek())
{
// You have to calc the Length being careful to not count twice the minutes that overlaps.
newInterval.Length = newInterval.Length + rec.Length - (newInterval.EndMinuteInWeek() - rec.StartMinuteInWeek());
}
}
마지막으로 당신은 overlaps
의 모든 간격을 삭제하고 newInterval
http://stackoverflow.com/questions/1233292/whats-a-good-generic-algorithm-for-collapsing-a-를 삽입 잠재적으로 중복되는 세트 – jball