获得有序集合的范围

时间:2013-03-07 11:12:56

标签: c# linq collections

我有一个有序的DateTime值集合。我想在特定的开始和结束时间之间检索集合中的所有值。我应该用什么样的集合以最有效的方式做到这一点以及如何做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用List<T>但请保持订购。使用BinarySearch方法在列表中查找您的开始DateTime。请注意,它返回:

  

如果找到项目,则排序列表中项目的从零开始的索引;否则,负数是下一个元素的索引的按位补码,如果没有更大的元素,则是Count的按位补码。

因此,如果值为负,则需要应用按位补码(~运算符)来查找范围内的第一个索引。然后,您可以使用相同的过程并减去1以查找范围内的最后一个元素。

答案 1 :(得分:0)

使用LINQ(因为这是你的标签之一),你可以这样做:

IEnumerable<DateTime> orderedDateTimes; // Your ordered DateTime collection
DateTime start;     // The start date/time, inclusive
DateTime end;       // The end date/time, inclusive

var range = orderedDateTimes
            .SkipWhile(dt => dt < start)
            .TakeWhile(dt => dt <= end);

这将采用 O(n)最坏情况来获得范围。但是,您可以将结果强制转换为列表或数组,以便能够有效地重用它:

DateTime[] rangeArray = range.ToArray();
// -or-
List<DateTime> rangeList = range.ToList();