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);