C# 将日期范围拆分为几个特定的日期范围块

C# 将日期范围拆分为几个特定的日期范围块,c#,datetime,date-range,overlap,C#,Datetime,Date Range,Overlap,我有一个带有特定值的定期日期范围列表: 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

我有一个带有特定值的定期日期范围列表:

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;
    }
private List GetOutput(日期时间开始、日期时间结束、列表范围)
{
列表周期=新列表();
foreach(特定范围内的输出项目sr)
{

如果(start>=sr.start&&sr.End,那么我将在这里冒险,假设在第二个示例中,开始日期应该在
01-01-2016
之前,因为如果我理解这个问题,您希望返回所有与您传递给该方法的开始到结束时间重叠的范围。
如果情况确实如此,那么你就接近了——但你的情况是错误的。
测试两个范围是否重叠的方法是检查一个范围是否先于另一个范围开始,反之亦然,正如您在标记的wiki中看到的:

当两个或多个元素部分或全部相互覆盖时,它们会重叠。 确定元素是否重叠的方法是测试一个元素是否在第二个元素结束之前开始,而第二个元素是否在第一个元素结束之前开始

因此,您的方法应该是:

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;
}
private List GetOutput(日期时间开始、日期时间结束、列表范围)
{
列表周期=新列表();
foreach(特定范围内的输出项目sr)
{

如果(开始>=sr.End和sr.start,我理解您的第一个示例,其中您只期望一个输出数据范围。但第二个示例不清楚。输入日期范围是否应为2016年1月1日至2017年4月29日(2017年而非2016年)?您在:start>=sr中有一个错误。start To:start Marius,您是对的!第二个示例输入日期范围是2016年1月1日至2017年4月29日