2013-03-07 45 views
1

我有一個有序集合DateTime值。我想在特定的開始時間和結束時間之間檢索集合中的所有值。我應該用什麼樣的方式以最有效的方式來做到這一點?獲取有序集合中的範圍

回答

1

您可以使用List<T>,但請保持訂購。使用BinarySearch方法在列表中找到您的開始DateTime。請注意,它返回:

如果找到項目,則排序列表中項目的從零開始的索引;否則,是一個負數,它是大於項的下一個元素的索引的按位補數,或者如果沒有更大的元素,則爲Count的逐位補碼。

因此,如果該值爲負數,則需要應用按位補碼(~運算符)來查找範圍內的第一個索引。然後,您可以使用相同的過程並減去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(); 
+2

它不會採取任何事實上的優點,即集合已被排序。我不認爲LINQ是這個問題的好選擇。 – MarcinJuraszek 2013-03-07 11:31:14

+0

@MarcinJuraszek:如果集合沒有排序,我的代碼將無法工作。所以它_does_利用這一點。但是,不能儘可能地擴展(二元搜索等)。但他添加了LINQ標籤,所以我回答。 – Virtlink 2013-03-07 11:32:54