首先,我有这段代码,如果满足条件,它将打破第二个循环。

因此,例如,如果第一次满足条件,则不会枚举第二个循环的其他元素。

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

10-04 23:03
查看更多