<分区>
从性能的角度来看,您应该使用什么“嵌套 foreach”或“lambda/linq 查询”?
<分区>
从性能的角度来看,您应该使用什么“嵌套 foreach”或“lambda/linq 查询”?
最佳答案
尽可能编写最清晰的代码,然后进行基准测试和分析以发现任何性能问题。如果您确实有性能问题,您可以尝试不同的代码来确定它是否更快(始终使用尽可能真实的数据进行测量),然后判断调用是否性能的提高值得可读性下降。
在许多情况下,直接foreach
方法将比 LINQ 更快。例如,考虑:
var query = from element in list
where element.X > 2
where element.Y < 2
select element.X + element.Y;
foreach (var value in query)
{
Console.WriteLine(value);
}
现在有两个 where
子句和一个 select
子句,所以每个最终项都必须通过三个迭代器。 (显然,在这种情况下可以组合两个 where 子句,但我只是提出一般性观点。)
现在将其与直接代码进行比较:
foreach (var element in list)
{
if (element.X > 2 && element.Y < 2)
{
Console.WriteLine(element.X + element.Y);
}
}
那会跑得更快,因为它需要穿过的圈数更少。虽然控制台输出可能会使迭代器成本相形见绌,但我当然更喜欢 LINQ 查询。
编辑:要回答“嵌套 foreach”循环...通常用 SelectMany
或第二个 from
子句表示:
var query = from item in firstSequence
from nestedItem in item.NestedItems
select item.BaseCount + nestedItem.NestedCount;
这里我们只添加了一个额外的迭代器,因为由于嵌套的 foreach
循环,我们已经在第一个序列中为每个项目使用了一个额外的迭代器。仍然有一些开销,包括在委托(delegate)中进行投影而不是“内联”(我之前没有提到)的开销,但它与嵌套 foreach 的性能仍然没有太大区别。
当然,这并不是说您不能用 LINQ 搬起石头砸自己的脚。如果您不先动脑筋,您可能会编写出极其低效的查询 - 但这远非 LINQ 所独有...
关于c# - "Nested foreach"与 "lambda/linq query"性能(LINQ 到对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1044236/