Период перекрытия с сопоставлением с образцом в c# 8 - PullRequest
0 голосов
/ 04 марта 2020

С улучшениями в сопоставлении с образцом в c# 8 было интересно, есть ли лучший способ написать следующее:

private bool HasOverlapTime(TimeSpan requestFrom, TimeSpan requestTo, TimeSpan detailFrom, TimeSpan detailTo)
{
    var timesOverlap = (requestFrom >= detailFrom && requestFrom < detailTo); //time From falls into range

    timesOverlap = !timesOverlap ? requestTo <= detailTo && requestTo > detailFrom : timesOverlap; // time to falls in range

    timesOverlap = !timesOverlap ? requestFrom <= detailFrom && requestTo >= detailTo : timesOverlap; // previous row false into new range

    return timesOverlap;
}

Ответы [ 3 ]

3 голосов
/ 04 марта 2020

Если предположить, что HasOverlapTime() должно вернуть true, если два временных диапазона перекрываются, а также что временные диапазоны представляют собой "полуоткрытые" интервалы (т. Е. Конец диапазона НЕ включен в диапазон), тогда гораздо более простая реализация:

private static bool HasOverlapTime2(TimeSpan requestFrom, TimeSpan requestTo, TimeSpan detailFrom, TimeSpan detailTo)
{
    return (detailTo > requestFrom) && (detailFrom < requestTo);
}

Нет необходимости использовать сопоставление с образцом для упрощения кода.

Обратите внимание, что ваш код использует полуоткрытые интервалы. Если вместо этого вы хотите использовать закрытые интервалы (т. Е. Интервал включает его время окончания), то вы должны изменить тест на:

private static bool HasOverlapTime(TimeSpan requestFrom, TimeSpan requestTo, TimeSpan detailFrom, TimeSpan detailTo)
{
    return (detailTo >= requestFrom) && (detailFrom <= requestTo);
}
0 голосов
/ 04 марта 2020

Использовал этот метод в конце, который уже был в решении

        var overlappingRanges = ranges.Any(a =>
            ranges.Any(b => b != a && !(a.DateFrom > b.DateTo || b.DateFrom > a.DateTo)));
        if (!noSameDay)
        {
            return overlappingRanges;
        }
        return overlappingRanges || ranges.Any(c => c.DateTo == c.DateFrom);
0 голосов
/ 04 марта 2020

Предложение (больше, чем ответ) заключается в рефакторинге вашего кода с использованием логических операторов. Это уменьшит размер кода и приведет к чрезмерной сложности. Операторы

& = и | = вполне могут подойти в вашем случае.

другой момент - на этот раз с использованием C# 8 - который может соответствовать хорошо это шаблон деконструкции. он позволяет вам извлекать эти данные внутри Tuple из класса, а затем записывать свои логики c в C # 8 ключ "сопоставление шаблонов свойств".

...