首先,我有这段代码,如果满足条件,它将打破第二个循环。
因此,例如,如果第一次满足条件,则不会枚举第二个循环的其他元素。
foreach (var evaluator in strategyEvaluators)
{
foreach (var rule in concatedRules)
{
var isEntryRuleMet = evaluator.Evaluate(rule.Code);
if (isEntryRuleMet)
{
matchedNames.Add(evaluator.Name);
break;
}
}
}
但是我还发现,可以通过以下方式缩短代码:
foreach (var evaluator in strategyEvaluators)
{
if (concatedRules.Select(rule=> evaluator.Evaluate(rule.Code)).Any(isEntryRuleMet => isEntryRuleMet))
{
matchedNames.Add(evaluator.Name);
}
}
请注意,对于第二种方法,我不知道
Select
方法将运行多少次。Select
返回true之后,Any
是否立即停止了?还是完成运行然后运行Any
? 最佳答案
在Any返回true之后,Select是否立即停止?还是已完成运行,然后运行了Any?
是的。您可以这样想:Select
只要返回Any
就会将元素转换成false
,一旦返回true
就会停止,其余元素将不产生。
这是一个将其删除的简单程序:
public static void Main()
{
var query = Enumerable.Range(0,10).Select(x => GetNumber(x)).Any(x => x > 5);
}
public static int GetNumber(int x)
{
Console.WriteLine("GetNumber is called: {0}", x);
return x;
}
// Output:
GetNumber is called: 0
GetNumber is called: 1
GetNumber is called: 2
GetNumber is called: 3
GetNumber is called: 4
GetNumber is called: 5
GetNumber is called: 6