C# 如何测试周期列表是否构成一年

C# 如何测试周期列表是否构成一年,c#,algorithm,C#,Algorithm,我有一个周期(日期)列表,我想测试它们是否构成一年 知道怎么做吗?周期不应有孔或重叠至少有两种方法: 您可以按开始日期对范围数组进行排序,然后检查每个范围的开始日期是否等于前一个范围的结束日期+1天 或 创建一个366布尔的数组,然后为每个范围填充该数组。如果你填写的一天已经是真实的,那么就存在重叠。最后一步是检查数组是否充满true 现在,最终实现总是比我想象的要复杂。。。第一种方法: static bool IsFullRange(DateRange[] dateRanges, in

我有一个周期(日期)列表,我想测试它们是否构成一年
知道怎么做吗?周期不应有孔或重叠

至少有两种方法:

  • 您可以按开始日期对范围数组进行排序,然后检查每个范围的开始日期是否等于前一个范围的结束日期+1天

  • 创建一个366布尔的数组,然后为每个范围填充该数组。如果你填写的一天已经是真实的,那么就存在重叠。最后一步是检查数组是否充满
    true
现在,最终实现总是比我想象的要复杂。。。第一种方法:

static bool IsFullRange(DateRange[] dateRanges, int year)
{
    // We shouldn't modify input parameters :-)
    // So we clone it
    dateRanges = (DateRange[])dateRanges.Clone();

    // Sort the array
    Array.Sort(dateRanges, (p, q) => p.Start.CompareTo(q.Start));

    // We skip dateRanges that are fully in previous years
    int i = Array.FindIndex(dateRanges, p => p.End.Year >= year);

    if (i == -1)
    {
        return false;
    }

    // The dateRange starts after the first of the year
    if (dateRanges[i].Start > new DateTime(year, 01, 01))
    {
        return false;
    }

    // We skip the first element
    for (i = i + 1; i < dateRanges.Length; i++)
    {
        if (dateRanges[i].Start > new DateTime(year + 1, 01, 01))
        {
            // Already on another year
            break;
        }

        // Overlap
        if (dateRanges[i].Start <= dateRanges[i - 1].End)
        {
            return false;
        }
    }

    // Does the last range "covers" the end of the year?
    if (dateRanges[i - 1].End < new DateTime(year, 12, 31))
    {
        return false;
    }

    return true;
}
你使用它就像:

DateRange[] dateRanges = new[] 
{ 
    new DateRange(new DateTime(2015, 6, 7), new DateTime(2015, 12, 2)),
    new DateRange(new DateTime(2015, 12, 03), new DateTime(2016, 03, 02)),
    new DateRange(new DateTime(2014, 11, 21), new DateTime(2015, 6, 6)),
};

bool res = IsFullRange(dateRanges, 2015);

请注意,非重叠和无孔仅在给定的
年份进行测试。

您是否有任何初步尝试分享?你遇到了什么问题?一些日期如何构成一年?你能解释一下吗,最好举个例子。应该是:根据开始日期对范围进行排序。和:检测方法2中的重叠:检查是否没有第二次设置日期是:-)但我将其留给后续问题“如何对日期范围进行排序”:-)哦,对不起,破坏了聚会…;)
DateRange[] dateRanges = new[] 
{ 
    new DateRange(new DateTime(2015, 6, 7), new DateTime(2015, 12, 2)),
    new DateRange(new DateTime(2015, 12, 03), new DateTime(2016, 03, 02)),
    new DateRange(new DateTime(2014, 11, 21), new DateTime(2015, 6, 6)),
};

bool res = IsFullRange(dateRanges, 2015);