0

我在使用 linq 时遇到了一些性能问题,这导致了我的第一个 stackoverflow 问题:

以下代码中的测试函数针对这两个 linqs 查询执行了不同的次数:

int[] mydata = { 1, 2, 34, 5, 67, 8 };

var query = from i in mydata select new { i,v=test(i)};       
var query2 = query.Where(v=>v.v == 2);
MessageBox.Show(query2.Count().ToString());

var query = from i in mydata where i==2 select new { i,v=test(i)};       
MessageBox.Show(query.Count().ToString());

还有 Count() 函数,真的需要评估选择部分吗?这也意味着执行 query2.Select(i=>i) 将触发 test() 调用

如果这是要走的路,要执行像调用这样的延迟过滤器,则应更改第二个查询以减少不必要的 test() 调用:

var query = from i in mydata where (filter ? v=filtevalue : true) select new { v=test(i)};       
MessageBox.Show(query.Count().ToString());

我需要执行的是构建一个大查询,然后在程序的不同部分过滤数据,而不为过滤掉的数据执行 Select 部分(以避免性能损失)。这可能吗?

提前致谢。

4

1 回答 1

0

Count涉及枚举。枚举涉及执行Select,这执行test。如果你只想计算你根本不需要Select,因为它不会改变元素的数量。如果您想减少test查询中的调用次数,请尝试将Wherebefore Select。( .Where(..).Select(..)) 如果您的搜索谓词(在 where 中的 lamda)取决于函数的结果,test则无法避免调用。

于 2010-06-30T11:55:39.580 回答