Сравнение DateTime в C# дает неожиданные результаты - PullRequest
0 голосов
/ 06 августа 2020

У меня есть следующая функция:

public bool IsAvailableForTimeslot(DateTime start, DateTime end)
    {
        bool startOK = true;
        bool endOK = true;
        foreach (var slot in ReservedSlots)
        {
            if (slot.Item2.AddHours(6) > start)
            {
                startOK = false;
            }
            if (slot.Item1 < end && start < slot.Item2)
            {
                endOK = false;
            }
        }
        if (startOK == true && endOK == true)
            return true;
        else
            return false;
    }

// List of Tuples with already reserved timeslots, Item1 being the start en 2 the end
    public List<Tuple<DateTime, DateTime>> ReservedSlots { get; set; }

Когда начальные даты и время в списке «ReservedSlots» совпадают с годом, что и параметры, функция возвращает все как обычно, но когда год отличается, функция отмечает startOK как ложное.

Дополнительная информация: Допустим, у меня есть 4 автомобиля со списком "ReservedSlots".

        demoVehicle0.ReservedSlots.Add(new Tuple<DateTime, DateTime>(new DateTime(2020, 1, 1, 12, 0, 0), new DateTime(2020, 1, 1, 20, 0, 0)));
        demoVehicle0.ReservedSlots.Add(new Tuple<DateTime, DateTime>(new DateTime(2020, 1, 2, 3, 0, 0), new DateTime(2020, 1, 2, 13, 0, 0)));
                // Works (returns false)

        demoVehicle2.ReservedSlots.Add(new Tuple<DateTime, DateTime>(new DateTime(2020, 1, 1, 12, 0, 0), new DateTime(2020, 1, 1, 20, 0, 0)));
        demoVehicle2.ReservedSlots.Add(new Tuple<DateTime, DateTime>(new DateTime(2020, 1, 2, 3, 0, 0), new DateTime(2020, 1, 2, 13, 0, 0)));
                // Works (returns false)

        demoVehicle3.ReservedSlots.Add(new Tuple<DateTime, DateTime>(new DateTime(2021, 1, 1, 1, 0, 0), new DateTime(2021, 1, 1, 5, 0, 0)));
                // Doesnt work (returns false) if I change the year to 2020, it will work however

        // timeslot is what is used in the parameters of the function above
        var timeslot = new Tuple<DateTime, DateTime>(new DateTime(2020, 1, 1, 20, 0, 0), new DateTime(2020, 1, 2, 0, 0, 0));

1 Ответ

1 голос
/ 06 августа 2020

Вы возвращаете false, если одна из переменных startOK или endOK ложна в конце итерации, но это должно возвращать только false, если оба из них оцениваются как false для того же слота .

Для достижения этой цели вы можете реструктурировать свой метод как таковой.

public bool IsAvailableForTimeslot(DateTime start, DateTime end)
{
    foreach (var slot in ReservedSlots)
    {
        if (start < slot.Item2.AddHours(6) && slot.Item1 < end)
            return false;
    }

    return true;
}

Или без явного определения al oop ...

using System.Linq;

public bool IsAvailableForTimeslot(DateTime start, DateTime end)
{
    return !ReservedSlots.Any(slot => start < slot.Item2.AddHours(6) && slot.Item1 < end);
}

Подробнее о обнаружении перекрывающихся периодов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...