当条件为真时,LINQ to对象是否停止处理Any()?

Car*_*lis 14 c# linq-to-objects

考虑以下:

bool invalidChildren = this.Children.Any(c => !c.IsValid());
Run Code Online (Sandbox Code Playgroud)

此类具有一组具有IsValid()方法的子对象.假设该IsValid()方法是处理器密集型任务.遇到的第一个孩子对象,其中经过IsValid()false,理论上可以处理停止,因为结果可能永远不会成为现实.LINQ to对象实际上是在第一个之后停止评估IsValid() = false(如逻辑AND)还是继续评估所有子对象?

显然我可以把它放在foreach循环中并打破第一个无效结果,但我只是想知道对象的LINQ是否足够智能来做到这一点.

编辑: 谢谢你的答案,由于某种原因,我不认为自己在MSDN上查找它.

Kel*_*sey 21

是的,它确实.一旦找到匹配,标准就会满足. All类似的是它检查所有项目,但如果一个项目不匹配,它也会立即结束.

Exists 也以同样的方式工作.

任何

一旦确定结果,就停止源的枚举.

存在

当前List的元素分别传递给Predicate委托,并在找到匹配时停止处理.

所有

一旦确定结果,就停止源的枚举.

等等...


Dav*_*sky 6

是的,一旦评估结果就会停止.这是一个快速证明:

class Program
    {
        static void Main(string[] args)
        {
            bool allvalid = TestClasses().Any(t => !t.IsValid());
            Console.ReadLine();
        }

        public static IEnumerable<TestClass> TestClasses()
        {
            yield return new TestClass() { IsValid = () => { Console.Write(string.Format("TRUE{0}",Environment.NewLine)); return true; } };
            yield return new TestClass() { IsValid = () => { Console.Write(string.Format("FALSE{0}", Environment.NewLine)); return false; } };
            yield return new TestClass() { IsValid = () => { Console.Write(string.Format("TRUE{0}", Environment.NewLine)); return true; } };
            yield return new TestClass() { IsValid = () => { Console.Write(string.Format("TRUE{0}", Environment.NewLine)); return true; } };
        }
    }

    public class TestClass
    {
        public Func<bool> IsValid {get;set;}
    }
Run Code Online (Sandbox Code Playgroud)