我有一个通用的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/