C# .where(…).Any()与..Any(…)之间的性能差异

C# .where(…).Any()与..Any(…)之间的性能差异,c#,linq-to-objects,C#,Linq To Objects,可能重复: 给定内存中的对象列表,我运行了以下两个表达式: myList.where(x => x.Name == "bla").Any() vs 后者总是最快的,我相信这是因为在哪里枚举所有项目。但这也会发生在没有匹配的情况下 我不知道确切的原因。是否有任何情况下,这种被观察到的性能差异不会是这种情况,比如它询问Nhib 干杯。带有谓词的Any()可以在没有迭代器的情况下执行其任务(产生返回值)。使用Where()会创建一个迭代器,这会增加对性能的影响(尽管影响很小) 因此,在性能

可能重复:

给定内存中的对象列表,我运行了以下两个表达式:

myList.where(x => x.Name == "bla").Any() 
vs

后者总是最快的,我相信这是因为在哪里枚举所有项目。但这也会发生在没有匹配的情况下

我不知道确切的原因。是否有任何情况下,这种被观察到的性能差异不会是这种情况,比如它询问Nhib

干杯。

带有谓词的
Any()
可以在没有迭代器的情况下执行其任务(
产生返回值
)。使用
Where()
会创建一个迭代器,这会增加对性能的影响(尽管影响很小)

因此,在性能方面(稍微),最好使用带有谓词(
x=>x.Name==“bla”
)的
Any()
形式。就我个人而言,我觉得这也更具可读性

另一方面,
Where()
不一定枚举所有元素,它只是创建一个迭代器,根据请求遍历元素,因此在
Where()
之后调用
Any()
将驱动迭代,迭代将在它找到的第一个匹配条件的项处停止


因此,性能差异是而不是
Where()
迭代所有项(在linq to objects中),因为它确实不需要(当然,除非它没有找到满足它的项),
Where()
子句必须设置一个迭代器遍历元素,而带有谓词的
Any()
则没有。

假设您将
where
更正为
where
并将
=
更正为
=
,我希望“
Any
带有谓词”版本的执行速度会稍微快一点。然而,我希望差异显著的情况很少,因此您应该首先着眼于可读性

碰巧,就可读性而言,我通常也更喜欢“
Any
with a predicate”(带谓词的任何代码)版本,因此你在这两方面都赢了——但你确实应该首先使用你认为更可读的版本。测量你实际关心的场景中的性能,如果一段代码没有按照你需要的那样执行,那么就考虑微优化它——当然在每一步测量。

我认为这是由于列举了所有项目

如果
myList
是内存中的集合,则它不是。
Where
方法使用延迟执行,因此它只会根据需要枚举尽可能多的项以确定结果。在这种情况下,您不会看到
.any(…)
之间有任何显著差异。其中(…).any()

在任何情况下,这种性能差异都不会 是这样的,就像是在质疑Nhib


是的,如果
myList
是一个数据源,它将采用方法生成的表达式,并转换为在其他地方运行的查询(例如LINQ到SQL),则您可能会看到差异。翻译表达式的代码在翻译其中一个表达式方面做得更好。

您运行了哪些测试?有多少次迭代?我们在这里谈论的是什么样的性能差异?这不应该有任何区别。快速更正:我怀疑你的意思是
=
而不是
=
。投票结束。这个问题的答案提供了充分的洞察力-SearchQueryTo是一个名为Name的字符串属性类。IList myList=新列表();对于(int i=0;i<500;i++){myList.Add(new searchqueryto{Name=i.ToString()};}var timer2=Stopwatch.StartNew();var res2=myList.Any(x=>x.Name==“499”);var time2=timer2.经过的时间//大约.5毫秒var定时器=秒表.StartNew();var res=myList.Where(x=>x.Name==“499”).Any();var time1=计时器。已用时间//大约3.5毫秒+1,对于任何带有谓词的,请关注可读性James,感谢您为我澄清这一点!我运行了几次,总是得到这样的性能差异。
myList.Any(x => x.Name == "bla")