I've to detect if two time periods are overlapping.
Every period has a start date and an end date.
I need to detect if my first time period (A) is overlapping with another one(B/C).
In my case, if the start of B is equal to the end of A, they are not overlapping(the inverse too)
I found the following cases:
So actually I'm doing this like this:
tStartA < tStartB && tStartB < tEndA //For case 1
OR
tStartA < tEndB && tEndB <= tEndA //For case 2
OR
tStartB < tStartA && tEndB > tEndA //For case 3
(The case 4 is taken in the account either in case 1 or in case 2)
It works, but it seems not very efficient.
So, first is there an existing class in c# that can modelize this(a time period), something like a timespan, but with a fixed start date.
Secondly: Is there already a c# code(like in the DateTime
class) which can handle this?
Third: if no, what would be your approach to make this comparison the most fast?
There is a wonderful library with good reviews on CodeProject: http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
That library does a lot of work concerning overlap, intersecting them, etc. It's too big to copy/paste all of it, but I'll see which specific parts which can be useful to you.
You can create a reusable Range pattern class :
You can add all methods you need to merge ranges, get intersections and so on...
I don't believe that the framework itself has this class. Maybe a third-party library...
But why not create a Period value-object class to handle this complexity? That way you can ensure other constraints, like validating start vs end datetimes. Something like:
That way you will be able to individually compare each period...
This is my solution:
I unit tested it with 100% coverage.
@Dushan Gajik, you seems to have bug in your last case - it sould be false.
Simple check to see if two time periods overlap:
or in your code:
(Use
<=
instead of<
if you change your mind about wanting to say that two periods that just touch each other overlap.)How about a custom interval-tree structure? You'll have to tweak it a little bit to define what it means for two intervals to "overlap" in your domain.
This question might help you find an off-the-shelf interval-tree implementation in C#.