Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从时间跨度列表中查找不同的时间跨度持续时间_C#_Timespan - Fatal编程技术网

C# 从时间跨度列表中查找不同的时间跨度持续时间

C# 从时间跨度列表中查找不同的时间跨度持续时间,c#,timespan,C#,Timespan,我在处理TimeSpan对象列表时遇到了一些麻烦,因为没有太多的代码,这些代码似乎还没有涵盖所有可能发生的情况,tbh,我想我现在有点代码/逻辑盲了 我有一个可能发生重叠的时间跨度列表,但我需要一个没有重叠但涵盖所有时间跨度的整个持续时间的时间跨度列表 例如(请注意,日期采用ddMMyyyy格式): 所以在这种情况下,我希望得到3个时间跨度: TSA: 01/01/2020 to 01/02/2020 (1 month - same as TS1 as there are no overlaps

我在处理TimeSpan对象列表时遇到了一些麻烦,因为没有太多的代码,这些代码似乎还没有涵盖所有可能发生的情况,tbh,我想我现在有点代码/逻辑盲了

我有一个可能发生重叠的时间跨度列表,但我需要一个没有重叠但涵盖所有时间跨度的整个持续时间的时间跨度列表

例如(请注意,日期采用ddMMyyyy格式):

所以在这种情况下,我希望得到3个时间跨度:

TSA: 01/01/2020 to 01/02/2020 (1 month - same as TS1 as there are no overlaps)
TSB: 01/03/2020 to 01/07/2020 (4 months - combination of TS2 and TS3)
TSC: 01/09/2020 to 01/01/2021 (4 months - combination of TS4 and TS5, technically only TS5 as TS4 is fully encompassed by TS5)
我曾尝试在网上研究一种算法,但没有成功


任何建议都非常受欢迎。

我建议尝试暴力搜索或深度优先搜索算法

首先,按开始日期对时间跨度进行排序

蛮力: 您尝试所有组合,并按重叠/不重叠对它们进行评分,您可能希望按覆盖总时间跨度的多少对它们进行评分

深度优先搜索:
编写一个递归算法,从添加第一个间隔开始,然后在出现重叠时添加更多间隔和回溯。

这根本不是优化的,但从语义上讲,您可以通过添加块并查找重叠,然后合并这些重叠来实现这一点;比如:

使用系统;
使用System.Collections.Generic;
利用制度全球化;
静态P类
{
静态void Main()
{
var results=新列表();
添加(“2020年1月1日”、“2020年2月1日”);
添加(“2020年3月1日”、“2020年5月1日”);
添加(“2020年4月1日”、“2020年7月1日”);
添加(“2020年10月1日”、“2020年12月1日”);
添加(“2020年9月1日”、“2021年1月1日”);
//请参见下文,重要提示
results.Sort();//初始排序
而(MergeOneOverlap()){}
foreach(结果中的var范围)
{
Console.WriteLine($“{range.From:dd/MM/yyyy}-{range.To:dd/MM/yyyy}”);
}
bool MergeOneOverlap()
{
for(int i=0;i结果。添加(
(DateTime.ParseExact(来自“dd/MM/yyyy”,CultureInfo.InvariantCulture),
DateTime.ParseExact(到“dd/MM/yyyy”,CultureInfo.InvariantCulture));
}
静态bool包含结论性(此(DateTime From,DateTime To)范围,DateTime when)
=>当>=范围从&&当x.ContainsInclusive(y.From)| | x.ContainsInclusive(y.To)| | y.ContainsInclusive(x.From)| | y.ContainsInclusive(x.To);
静态(DateTime From,DateTime To)合并(此(DateTime From,DateTime To)x,(DateTime From,DateTime To)y)
=>(x.Fromy.To?x.To:y.To);
}
如果这是针对大量数据的,那么您必须更加聪明,以避免出现O(N^3)问题。合并每个添加项可能会有所帮助,如果这样可以减少项目数量的话

也可以将复杂性降低到O(N^2)并纯粹向前合并(即,成功合并时不要中断),但我还没有应用足够的思想来了解这一点的含义。而O(N^2)仍然相当糟糕

对于大数据,使用排序列表可能会有所帮助,因此可以对开始日期进行二进制搜索以找到插入点。不过,这比我想在这里写的要复杂得多


我95%确信这也可以,即O(N^2):

MergeOverlaps();
foreach(结果中的var范围)
{
Console.WriteLine($“{range.From:dd/MM/yyyy}-{range.To:dd/MM/yyyy}”);
}
void MergeOverlaps()
{
results.Sort();
for(int i=0;i
您试图解决什么问题?这(几乎)正是我所需要的!我只是在单元测试中遇到了一些“一个接一个”的错误,我假设这些错误将一直持续到被排除在外的一段时间的结束日期。
TSA: 01/01/2020 to 01/02/2020 (1 month - same as TS1 as there are no overlaps)
TSB: 01/03/2020 to 01/07/2020 (4 months - combination of TS2 and TS3)
TSC: 01/09/2020 to 01/01/2021 (4 months - combination of TS4 and TS5, technically only TS5 as TS4 is fully encompassed by TS5)