我有一个通用的List<T> ticker集合,其中T对象除其他外具有AsOfDate属性DateTime
此列表集合可以包含> 2万个项目。

我从AsOfDate获取最近的小时数,其中的金额由类型为amount的变量int指定(例如3)

我的代码是:

from x in ticker
let y = ticker.OrderByDescending(y => x.AsOfDate).First()
where x.AsOfDate > y.AsOfDate.AddHours(-amount)
orderby x.AsOfDate descending
select x).ToList();


当使用小型数据集(例如列表中的200个项目)时,这可以正常工作。但是,当处理列表中的20,000多个项目时,我看到了严重的速度问题(3分钟)。

为什么LINQ查询花费这么长时间?我该如何改善呢?

最佳答案

您可以通过预提取y来解决此问题:

var dateLimit = ticker
    .OrderByDescending(y => x.AsOfDate)
    .First().AsOfDate.AddHours(-amount);

var result =(
    from x in ticker
    where x.AsOfDate > dateLimit
    orderby x.AsOfDate descending
    select x
).ToList();


当前,您需要在每次迭代中重新评估y,这需要对O(n2log2n)的整体时间效率进行排序。

关于c# - 在大型集中按小时获取最新数据时,LINQ出现性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51275320/

10-11 16:08