Grundsätzlich möchte ich nur überprüfen, ob eine Zeitperiode mit einer anderen überlappt. Null Enddatum bedeutet bis unendlich. Kann mir jemand das für mich verkürzen, da es manchmal ziemlich schwer zu lesen ist. ProstKann mir jemand diesen Algorithmus für mich vereinfachen?
public class TimePeriod
{
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool Overlaps(TimePeriod other)
{
// Means it overlaps
if (other.StartDate == this.StartDate
|| other.EndDate == this.StartDate
|| other.StartDate == this.EndDate
|| other.EndDate == this.EndDate)
return true;
if(this.StartDate > other.StartDate)
{
// Negative
if (this.EndDate.HasValue)
{
if (this.EndDate.Value < other.StartDate)
return true;
if (other.EndDate.HasValue && this.EndDate.Value < other.EndDate.Value)
return true;
}
// Negative
if (other.EndDate.HasValue)
{
if (other.EndDate.Value > this.StartDate)
return true;
if (this.EndDate.HasValue && other.EndDate.Value > this.EndDate.Value)
return true;
}
else
return true;
}
else if(this.StartDate < other.StartDate)
{
// Negative
if (this.EndDate.HasValue)
{
if (this.EndDate.Value > other.StartDate)
return true;
if (other.EndDate.HasValue && this.EndDate.Value > other.EndDate.Value)
return true;
}
else
return true;
// Negative
if (other.EndDate.HasValue)
{
if (other.EndDate.Value < this.StartDate)
return true;
if (this.EndDate.HasValue && other.EndDate.Value < this.EndDate.Value)
return true;
}
}
return false;
}
}
Wow, das ist ein Biest :) –
Große Frage, aber darf ich einen besseren Namen vorschlagen? Wie wäre es mit "Präzise Art zu sagen, ob zwei DateTime-Paare überlappen?" –
Ein typischer Fall von "geistiger Brutalität" ist ein Problem, indem alle möglichen Konstellationen versucht werden. Die Leute versuchen oft sofort, Probleme zu lösen, anstatt wirklich über das Problem nachzudenken. Die Lösung kommt dann viel einfacher und wahrscheinlicher ist es eine gut durchdachte Lösung. –