gpt4 book ai didi

c# - Where 子句比项目计数更频繁地调用

转载 作者:行者123 更新时间:2023-11-30 20:49:59 25 4
gpt4 key购买 nike

我有一个 List<Order>我正在尝试使用 LINQ 对此进行过滤:

var grouped = from o in orders
group o by o.OrderNumber into g
select new { Id = g.Key, Orders = g };

var GroupedList = grouped.ToList();

int max = GroupedList.Count();
int count = 0;
var filtered =
from g in GroupedList
where IncrementProgress(max, ref count)
select g.Id;

var filteredOrders = orders.Where(o => filtered.Contains(o.OrderNumber));

IncrementProgress里面我打印 countmax到调试输出。 max在我的测试 3500 中,我从 count 得到输出150000 和计数。

有人知道为什么吗?

PS:在我的生产代码中有过滤器逻辑而不是 IncrementProgress .

更新:

这里是 IncrementProgress -方法:

private bool IncrementProgress(int max, ref int count)
{
Debug.WriteLine("Filtering {0} of {1}", ++count, max);
return true;
}

最佳答案

那是因为 LINQ 是惰性的并且 filtered不是一个集合——它是一个内存查询,它只存储如何评估结果的信息,而不是结果本身。因此,每次您使用 filtered它再次被评估,遍历 GroupedList并检查 where再次条件。

意思是,where条件将被评估 orders.Count() * GroupedList.Count()次。

添加ToList()调用 filtered急切地评价它。

var filtered =
(from g in GroupedList
where IncrementProgress(max, ref count)
select g.Id).ToList();

但是,因为您只使用了 Containsfiltered稍后,您应该使用 HashSet<int>存储结果。它将使Contains调用 O(1) 而不是 O(n),这应该会大大提高性能。

var filtered =
new HashSet<int>(from g in GroupedList
where IncrementProgress(max, ref count)
select g.Id);

关于c# - Where 子句比项目计数更频繁地调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22884250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com