Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 666
  • Last Modified:

check on overlapping dates

I have an object which has two date values begin date and end date.  In fact there are multiple objects with begin date and end date. what i want to do is check that the dates of this objects dont overlap with each other. so for example object[0]'s begin date and end date is 08/16/2010 - 08/30/2010 and for object [1] begin date and end date is 08/20/2010-09/30/2010. if this the case then i wan to throw and error message.

can someone tell me how to do this in C#.

0
pratikshahse
Asked:
pratikshahse
2 Solutions
 
nmarunCommented:
Here's a snippet that worked for me.Arun
public class Dummy
{
    public int Id { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

private static void CheckOverlapDates()
{
    List<Dummy> dummies = new List<Dummy>();
    dummies.Add(new Dummy
                    {
                        Id = 1,
                        StartDate = new DateTime(2010, 1, 1),
                        EndDate = new DateTime(2010, 1, 10)
                    });
    dummies.Add(new Dummy
                    {
                        Id = 2,
                        StartDate = new DateTime(2010, 1, 8),
                        EndDate = new DateTime(2010, 1, 20)
                    });
    dummies.Add(new Dummy
                    {
                        Id = 3,
                        StartDate = new DateTime(2010, 1, 20),
                        EndDate = new DateTime(2010, 1, 30)
                    });
    dummies.Add(new Dummy
                    {
                        Id = 4,
                        StartDate = new DateTime(2010, 1, 30),
                        EndDate = new DateTime(2010, 2, 10)
                    });
    dummies.Add(new Dummy
                    {
                        Id = 5,
                        StartDate = new DateTime(2010, 2, 10),
                        EndDate = new DateTime(2010, 2, 20)
                    });

    for (int i = 0; i < dummies.Count; i++)
    {
        for (int j = i+1; j < dummies.Count; j++)
        {
            if(dummies[i].EndDate > dummies[j].StartDate)
            {
                Console.WriteLine("object {0} overlaps with object {1}", dummies[i].Id, dummies[j].Id);
            }
        }
    }
}

Open in new window

0
 
kris_perCommented:
Logic is:
- if one's start date is within another's start/end dates
- or if one's end date is within another's start/end dates

public bool IsOverlapping()
        {
            List<MyObject> list = new List<MyObject>();

            foreach (MyObject o in list)
            {
                foreach (MyObject i in list)
                {
                    // logic is - if one start date is within another start/end dates
                    // or if one end date is within another start/end dates
                    if( (i.StartDate > o.StartDate && i.StartDate < o.EndDate)
                        || (i.EndDate > o.StartDate && i.EndDate < o.EndDate)
                        || (o.StartDate > i.StartDate && o.StartDate < i.EndDate)
                        || (o.EndDate > i.StartDate && o.EndDate < i.EndDate) )
                    {
                        return true; // yes overlapping
                    }
                }
            }

            return false; // not overlapping
        }

Open in new window

0
 
kris_perCommented:

Contnuing previous code, If the overlapping is including the dates, then you have to add '=' operator in all comparisons above:
public static bool IsOverlapping()
        {
            List<MyObject> list = new List<MyObject>();

            foreach (MyObject o in list)
            {
                foreach (MyObject i in list)
                {
                    // logic is - if one start date is within another start/end dates
                    // or if one end date is within another start/end dates
                    if( (i.StartDate >= o.StartDate && i.StartDate <= o.EndDate)
                        || (i.EndDate >= o.StartDate && i.EndDate <= o.EndDate)
                        || (o.StartDate >= i.StartDate && o.StartDate <= i.EndDate)
                        || (o.EndDate >= i.StartDate && o.EndDate <= i.EndDate))
                    {
                        return true; // yes overlapping
                    }
                }
            }

            return false; // not overlapping
        }

Open in new window

0
Learn Veeam advantages over legacy backup

Every day, more and more legacy backup customers switch to Veeam. Technologies designed for the client-server era cannot restore any IT service running in the hybrid cloud within seconds. Learn top Veeam advantages over legacy backup and get Veeam for the price of your renewal

 
SadrulCommented:
You should first sort the list in increasing start-date. After that, you can do a linear traversal of the list to figure out if two date-ranges overlap or not. This way, the worst-case running time would be nlog(n), whereas looking in the unsorted list will be n^2.
0
 
anarki_jimbelCommented:
About sorting (Sadrul's note) - just to remind that sorting also takes some time and has complexity, e.g., n*log(n)
0
 
SadrulCommented:
Correct. That is why I note that the overall complexity of the process will also be nlog(n) (sorting takes nlog(n), the linear traversal is n).
0

Featured Post

Prepare for your VMware VCP6-DCV exam.

Josh Coen and Jason Langer have prepared the latest edition of VCP study guide. Both authors have been working in the IT field for more than a decade, and both hold VMware certifications. This 163-page guide covers all 10 of the exam blueprint sections.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now