Как избежать дат, которые подпадают под определенный диапазон дат - PullRequest
0 голосов
/ 20 ноября 2018

Мой gridview принимает данные для планирования поездок для конкретной команды. Мне нужно, чтобы их поездки не сталкивались с другими датами.

рассмотрим следующий сценарий.

------------------------------------------
| TripName  | FromDate   |     ToDate    |
------------------------------------------
| Delhi     | 01/11/2018 |    05/11/2018 |
| Chennai   | 07/11/2018 |    12/11/2018 |
| Bengaluru | 06/11/2018 |    11/11/2018 |
------------------------------------------

последняя запись недействительна, потому что она конфликтует со вторым отключением. Мне нужно избегать этого.

1 Ответ

0 голосов
/ 20 ноября 2018

Так что, если я хорошо понимаю, вы хотели бы проверить, есть ли какое-либо пересечение между какой-либо датой и временем.

Обновлено:

Определите класс с интервалами:

class DateTimeInterval
{
    public DateTime Start { get; }
    public DateTime End { get; }

    public TimeSpan Length { get { return End - Start; } }
    public DateTimeInterval(DateTime startDate, DateTime endDate)
    {
        if (endDate < startDate)
            throw new ArgumentException();

        Start = startDate;
        End = endDate;
    }

    public bool Intersect(DateTimeInterval other)
    {
        if((other.Start <= Start && other.End >= Start) || //left intersect
           (other.End >= End && other.Start <= End) || //right intersect
           (other.Start >= Start && other.End <= End)) //middle intersect
        {
            return true;
        }

        return false;
    }

    static public bool Intersect(DateTimeInterval dti1, DateTimeInterval dti2)
    {
        if ((dti1.Start <= dti2.Start && dti1.End >= dti2.Start) || //left intersect
           (dti1.End >= dti2.End && dti1.Start <= dti2.End) || //right intersect
           (dti1.Start >= dti2.Start && dti1.End <= dti2.End)) //middle intersect
        {
            return true;
        }

        return false;
    }
}

И используйте здесь тестовый пример для класса:

List<DateTimeInterval> dtiList = new List<DateTimeInterval>();
DateTimeInterval dtInterval = new DateTimeInterval(new DateTime(2018, 09, 10), new DateTime(2018, 09, 20));

dtiList.Add(new DateTimeInterval(new DateTime(2018, 06, 12), new DateTime(2018, 7, 1)));
dtiList.Add(new DateTimeInterval(new DateTime(2018, 09, 05), new DateTime(2018, 09, 15)));
dtiList.Add(new DateTimeInterval(new DateTime(2018, 09, 12), new DateTime(2018, 09, 20)));
dtiList.Add(new DateTimeInterval(new DateTime(2018, 09, 11), new DateTime(2018, 09, 15)));
dtiList.Add(new DateTimeInterval(new DateTime(2018, 09, 5), new DateTime(2018, 09, 9)));

foreach(var dti in dtiList)
{                          
   Console.WriteLine(DateTimeInterval.Intersect(dtInterval, dti));
}

Если у вас есть DateInterval0, DateInterval1, DateInterval2, DateInterval3, DateIntervalN , которые вы должны проверитьпересекается между

  • DateInterval0 и DateInterval1
  • DateInterval0 и DateInterval2
  • ...
  • DateInterval0 и DateIntervalN
  • ...
  • DateIntervalN-1 и DateIntervalN

И в вашей программе проверьте пересечение как:

for(var i = 0; i < dates.Length-2; ++i)
   for(var j = i+1; i < dates.Length-1; ++j)
      DateTimeInterval.Intersect(datesInterval[i], datesInterval[j]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...