C# IEnumerable.Any(Func)何时返回值?

C# IEnumerable.Any(Func)何时返回值?,c#,performance,linq,lambda,ienumerable,C#,Performance,Linq,Lambda,Ienumerable,我最近在我使用的一个代码库中看到了一些代码,ReSharper提供将其重构为collection.Any(Func) 我想知道这对性能的影响。假设我有一个类似这样的电话: bool hasEvenValue=collection.Any(i=>(i%2)==0) …和看起来像这样的数据 {1,2,3,5,3,5,1,3,5,2} Enumerable.Any()何时返回该值?第二个数据元素,或者在本例中,它会在返回true之前处理每个元素吗?它会在看到匹配元素时立即返回,或者如果没有,它会处理整

我最近在我使用的一个代码库中看到了一些代码,ReSharper提供将其重构为
collection.Any(Func

我想知道这对性能的影响。假设我有一个类似这样的电话:

bool hasEvenValue=collection.Any(i=>(i%2)==0)

…和看起来像这样的数据

{1,2,3,5,3,5,1,3,5,2}


Enumerable.Any()何时返回该值?第二个数据元素,或者在本例中,它会在返回true之前处理每个元素吗?

它会在看到匹配元素时立即返回,或者如果没有,它会处理整个序列

因此,它比使用
.Count(…)!=0
(可读性和语义意义也更高)

IEnumerable.Any(Func)何时返回值


执行时总是立即执行,因为它不是延迟执行的。它返回一个布尔值,指示序列中的一个元素是否对给定谓词返回true。因此,它不需要执行整个查询,不像
Count

这里是
IEnumerable.Any(…)
的实现(使用dotKeep未编译):

public static bool Any(此IEnumerable源代码,Func谓词)
{
if(source==null)
抛出错误。ArgumentNull(“源”);
if(谓词==null)
抛出错误。ArgumentNull(“谓词”);
foreach(源中的TSource source1)
{
if(谓词(source1))
返回true;
}
返回false;
}

因此,基本上只要一个项目满足条件,它就会返回。

下面是我在LINQPad中编写的一些代码,以说明
Any
操作符在第一次匹配后终止

void Main()
{
    Console.WriteLine("Are there any evens? " + YieldEvenThenThrowEnumerable().Any(i => i % 2 == 0));
    Console.WriteLine("still running");
    Console.WriteLine("Are there any odds? " + YieldEvenThenThrowEnumerable().Any(i => i % 2 == 1));
    Console.WriteLine("never reaches this point");
}

IEnumerable<int> YieldEvenThenThrowEnumerable()
{
    yield return 2;
    throw new InvalidOperationException("TEST");
}
void Main()
{
WriteLine(“有任何evens吗?”+YieldEvenThenThrowEnumerable().any(i=>i%2==0));
Console.WriteLine(“仍在运行”);
WriteLine(“是否存在任何可能性?”+YieldEvenThenThrowEnumerable().any(i=>i%2==1));
Console.WriteLine(“从未达到此点”);
}
IEnumerable yieldenthenthrowenumerable()
{
收益率2;
抛出新的InvalidOperationException(“测试”);
}
哪些产出:

有晚上吗?
正确
仍在运行
<;此时从enumerable引发InvalidOperationException>


如果测试“If Any”的第一个
Any
调用遍历了整个可枚举项,则程序将在不显示任何消息的情况下终止。第二个调用用于说明“if any are odd”测试遍历整个列表,导致抛出异常。

它是否一次返回一个异常?它能返回chunk吗?Any返回一个布尔值-true或false,dataset有一个元素是否满足条件。对于在LINQ中返回块,您最好使用.Select(),但这超出了本主题的范围。
void Main()
{
    Console.WriteLine("Are there any evens? " + YieldEvenThenThrowEnumerable().Any(i => i % 2 == 0));
    Console.WriteLine("still running");
    Console.WriteLine("Are there any odds? " + YieldEvenThenThrowEnumerable().Any(i => i % 2 == 1));
    Console.WriteLine("never reaches this point");
}

IEnumerable<int> YieldEvenThenThrowEnumerable()
{
    yield return 2;
    throw new InvalidOperationException("TEST");
}