我正在使用新的WPF工具包的Chart來繪製大型數據集。我還有一個十字線跟蹤器,它跟蹤鼠標,當它在圖表區域上時,確切地告訴最近的數據點的值(請參閱雅虎財務圖表)。數據過濾或更好的LINQ查詢?
我使用下面的代碼來找到距鼠標當前懸停位置較近(或相等)的最近數據點(關於圖表的令人討厭的細節是它實際上插入了數據以告訴您什麼是EXACT值在那裏你在掀掉你的鼠標,即使該鼠標所在的數據點之間):
TimeDataPoint point = mainSeries.Find(
new Predicate<TimeDataPoint>(
delegate(TimeDataPoint p) {
return xValue > p.Date && !mainSeries.Exists(new Predicate<TimeDataPoint>(
delegate(TimeDataPoint middlePoint) {
return middlePoint.Date > p.Date && xValue > middlePoint.Date;
}));
}));
[這裏,mainSeries
簡直就是一個List<TimeDataPoint>
]
這非常適用於相對較小的數據集,但一旦我達到12000+點(這將會迅速增加),上面的代碼會減慢n停頓(它通過數據運行12000 +^2次)。
我不擅長構建查詢,所以我想知道是否可以使用更好的LINQ查詢來做到這一點。
編輯:另一個靈感來自@Randolpho評論的想法是這樣的:我將搜索所有低於給定的點(這將是至多n(這裏:12,000+)),然後選擇一個最大值<> (它也應該至多是O(n))。這應該產生相同的結果,但只有在n次操作的順序,因此應該至少更快一點...
我的另一種選擇是實際篩選數據集並保持點數的上限取決於用戶希望看到的細節水平。如果有更高效的查詢的可能性,我寧願不走這條路。
這是一個有趣的想法,但我不需要在12000+對之間查找x/y嗎?您能否詳細說明我應該如何存儲預先計算的x/y對以進行快速查找? 例如,我有(200,300)和(250,300)的數據點,並且用戶的鼠標位於(225,300)。 – Alexandra 2009-12-01 17:24:33