c# - "Nested foreach"与 "lambda/linq query"性能(LINQ 到对象)

标签 c# lambda foreach linq-to-objects

<分区>

从性能的角度来看,您应该使用什么“嵌套 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/

相关文章:

c# - 字符串问题

lambda - 将 CustomObject 列表转换为 Guava Table 集合,复杂性较低

c# - 命名参数规范必须出现在指定所有固定参数之后

c# - LINQ 副作用

C# 使用 Dynamic 关键字通过字符串访问属性而无需反射

c# - 如何将 XML 读入与其 xsd 匹配的类中

c# - 来自 sql 的 Lambda 表达式

Javascript forEach() 跳过项目

javascript - knockout . foreach 一个 child 的 child 不工作

c# - SignalR - 从上下文调用静态类型的集线器