Skip to main content
 首页 » 编程设计

c#之在大型集合上按小时获取最新数据时,LINQ 出现性能问题

2024年02月25日42myhome

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