我知道如果我在同一个语句中链接&&或||运算符,c#将停止计算语句并在计算表达式时返回相应的结果,无论以下表达式是什么,结果都不会改变.例如:
var result = false && foo() && bar();
Run Code Online (Sandbox Code Playgroud)
在此语句中,由于第一个表达式为false foo(),bar()因此永远不会执行.我的问题是,Enumerable.Aggregate<TSource,?TAccumulate>当在一个bool列表上运行时会做同样的事情还是会评估所有表达式而不管?例如:
var result = new List<bool>
{
false,
foo(),
bar()
}.Aggregate(true, (acc, x) => acc && x);
Run Code Online (Sandbox Code Playgroud)
&&你的例子中的操作员会短路,是的. x不会被评估的任何时间acc是false.
当然,需要为每个元素执行整个谓词. Aggregate没有办法知道以后执行它不会改变聚合值.
您的聚合函数实际上是All对数据集执行操作,如果您使用该All操作,而不是更通用Aggregate,它能够在给定谓词确定false结果已知且无法更改时确定,并且不需要在其余元素上调用谓词(就像找到值Or时一样true).