【问题标题】:Aggregate vs. Any, for scanning objects such as IEnumerable<bool>Aggregate vs. Any,用于扫描 IEnumerable<bool> 等对象
【发布时间】:2010-03-05 18:21:33
【问题描述】:

只是想知道是否有任何 LINQ 专家能够阐明 Aggregate 和 Any 是如何在幕后工作的。

想象一下,我有一个 IEnumerable,它存储在给定条件下测试数组的结果。我想确定数组的任何元素是否为假。有什么理由我应该更喜欢一个选项吗?

IEnumerable<bool> results = PerformTests();

return results.Any(r => !r); //Option 1
return results.Aggregate((h, t) => h && t); //Option 2

在生产代码中,我倾向于使用 1,因为它更明显,但出于好奇想知道这些在底层的评估方式是否存在差异。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    是的,绝对更喜欢选项 1 - 一旦发现任何值为 false 的值,它就会停止。

    选项 2 将遍历整个数组。

    当然还有可读性问题:)

    【讨论】:

    • 啊,好吧 - 我想知道它是否足够聪明,一旦头部变为假就停止,因为知道结果将永远是假的。谢谢!
    【解决方案2】:

    乔恩再次击败了我,但要添加更多文字:

    聚合总是需要消耗整个IEnumerable&lt;T&gt;,因为这正是它应该做的:从您的(完整)源生成数据集。 就是众所周知的 Map/Reduce 场景中的“Reduce”。

    【讨论】:

    • 感谢额外的东西 - 我一直在使用聚合来做一些小的字符串连接和其他转换,并发现自己自动编写选项 2,然后才意识到 Any() 是一个更简单的选项。
    • 除非您需要为每个连接做其他事情,否则我建议使用 string.Join over Aggregate 连接 IEnumerable
    猜你喜欢
    • 2020-02-25
    • 2014-05-20
    • 2021-06-08
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2014-10-26
    相关资源
    最近更新 更多