我有一个通用的 List<T> ticker收藏地点T除其他外,对象具有属性 AsOfDate这是DateTime . 此列表集合可以包含 >20k 项。
我正在从 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).
