Разделить диапазон дат на несколько определенных фрагментов диапазона дат - PullRequest
0 голосов
/ 27 октября 2018

У меня есть обычный список диапазонов дат с определенным значением:

14.09.2012 - 31.12.2015 = 8.25
01.01.2016 - 13.06.2016 = 11.00
14.06.2016 - 18.09.2016 = 10.50
19.09.2016 - 26.03.2017 = 10.00
27.03.2017 - 01.05.2017 = 9.75
02.05.2017 - 18.06.2017 = 9.25
19.06.2017 - 17.09.2017 = 9.00
18.09.2017 - 29.10.2017 = 8.50
30.10.2017 - 17.12.2017 = 8.25
18.12.2017 - 11.02.2018 = 7.75
12.02.2018 - 25.03.2018 = 7.50
26.03.2018 - 16.09.2018 = 7.25
17.09.2018 - NOW = 7.50

Я ищу метод, который делит один диапазон входных данных на вышеуказанные диапазоны данных с учетом значения коэффициента.

Например, если у меня есть входной диапазон дат 01.01.2016 - 09.02.2016, мне нужно получить один выходной диапазон дат и коэффициент:

01.01.2016 - 13.06.2016 = 11.00

Но если у меня есть диапазон ввода даты 01.01.2016 - 29.04.2017, мне нужно получить следующие диапазоны и коэффициенты:

14.09.2012 - 31.12.2015 = 8.25 
01.01.2016 - 13.06.2016 = 11.00 
14.06.2016 - 18.09.2016 = 10.50 
19.09.2016 - 26.03.2017 = 10.00
27.03.2017 - 01.05.2017 = 9.75

Класс для выходных данных:

public class OutputItem 
{

    public OutputItem()
    {

    }

    public DateTime Start { get; set; } = new DateTime();

    public DateTime End { get; set; } = new DateTime();

    public double Coeff { get; set; } = 0;
}

Методчто я пытаюсь получить выходные данные

    private List<OutputItem> GetOutput(DateTime start, DateTime end, List<OutputItem> specificRanges)
    {
        List<OutputItem> periods = new List<OutputItem>();

        foreach (OutputItem sr in specificRanges)
        {
            if (start >= sr.Start && sr.End <= end)
            {
                periods.Add(new OutputItem { Start = sr.Start, End = sr.End, Coeff = sr.Coeff });
            }
        }

        return periods;
    }

1 Ответ

0 голосов
/ 28 октября 2018

Итак, я собираюсь выйти на конечность и предположить, что во втором примере дата начала должна была быть раньше 01-01-2016 - потому что, если я понимаю вопрос, вы надеетесь вернуть все перекрывающиеся диапазоны время начала и окончания, когда вы переходите к методу.
Если это действительно так, вы близки, но ваше состояние не так.
Чтобы проверить, перекрываются ли два диапазона, нужно проверить, начинается ли один из них раньше, чем заканчивается другой, и наоборот, как вы можете видеть в вики тега :

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

Итак, ваш метод должен быть:

private List<OutputItem> GetOutput(DateTime start, DateTime end, List<OutputItem> specificRanges)
{
    List<OutputItem> periods = new List<OutputItem>();

    foreach (OutputItem sr in specificRanges)
    {
        if (start >= sr.End && sr.Start <= end)
        {
            periods.Add(new OutputItem { Start = sr.Start, End = sr.End, Coeff = sr.Coeff });
        }
    }

    return periods;
}
...