C# IEnumerable.Any(Func)何时返回值?
我最近在我使用的一个代码库中看到了一些代码,ReSharper提供将其重构为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之前处理每个元素吗?它会在看到匹配元素时立即返回,或者如果没有,它会处理整
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");
}