我有一个按照时间顺序排列的
我有一个查询,希望返回在特定时间范围内的
这段代码执行速度较慢,我希望将foreach部分转换为二分查找(或其他适当的算法),然后使用二分查找从原始列表中复制到新列表中,但由于每个范围都有起始时间和结束时间,我不确定该如何操作。如有帮助,将不胜感激。
这些范围不重叠。例如,第0个范围的结束时间始终小于第1个范围的开始时间。
范围示例:
TimeRange
对象列表。每个 TimeRange
对象都有开始和结束的 DateTime
对象。我有一个查询,希望返回在特定时间范围内的
TimeRange
。我目前使用下列函数:protected List<TimeRange> GetBoundedTimeRanges(List<TimeRange> timeRanges, DateTime startTime,
DateTime endTime)
{
if (timeRanges == null || timeRanges.Count == 0)
{
return null;
}
var ranges = new List<TimeRange>();
foreach (var range in timeRanges)
{
// If the end of the range is before the start time
if (range.End < startTime)
{
continue;
}
// If the start of the range is after the end time
// then break.
if (range.Start > endTime)
{
break;
}
// Otherwise the value falls between the range
ranges.Add(range);
}
return ranges;
}
这段代码执行速度较慢,我希望将foreach部分转换为二分查找(或其他适当的算法),然后使用二分查找从原始列表中复制到新列表中,但由于每个范围都有起始时间和结束时间,我不确定该如何操作。如有帮助,将不胜感激。
这些范围不重叠。例如,第0个范围的结束时间始终小于第1个范围的开始时间。
范围示例:
Range found - Start Time 03/02/2015 22:51:50, End Time 10/03/2015 15:44:56
Range found - Start Time 10/03/2015 15:46:26, End Time 11/03/2015 08:38:56
Range found - Start Time 11/03/2015 08:43:12, End Time 13/03/2015 04:15:05
Range found - Start Time 13/03/2015 04:15:08, End Time 17/03/2015 13:38:21
Range found - Start Time 17/03/2015 13:40:00, End Time 17/03/2015 15:15:52
Range found - Start Time 17/03/2015 15:19:05, End Time 17/03/2015 15:20:42
Range found - Start Time 17/03/2015 15:39:48, End Time 24/03/2015 16:37:29
Range found - Start Time 24/03/2015 16:42:25, End Time 25/03/2015 07:46:54
Range found - Start Time 25/03/2015 07:50:23, End Time 25/03/2015 15:36:33
Range found - Start Time 25/03/2015 15:40:15, End Time 25/03/2015 15:48:44
Range found - Start Time 25/03/2015 15:52:40, End Time 25/03/2015 15:57:21
Range found - Start Time 25/03/2015 16:01:22, End Time 31/03/2015 09:18:49
Range found - Start Time 31/03/2015 09:22:12, End Time 01/04/2015 10:00:26