C# Linq ANY vs ALL - 性能 [关闭]
Posted
技术标签:
【中文标题】C# Linq ANY vs ALL - 性能 [关闭]【英文标题】:C# Linq ANY vs ALL - Performance [closed] 【发布时间】:2021-11-06 18:18:51 【问题描述】:我试图弄清楚 ANY 和 ALL 在 Linq 中是如何工作的。
假设我的列表中有 10 万条记录。哪一个应该执行得更快?
if(recordsList.All(r => r.Deleted) == true)
或
if(recordsList.Any(r => r.Deleted == false) == false)
我认为如果列表中的第一条记录被删除,ANY 应该执行得更快,它应该停止并返回 true,而不是使用总是检查整个列表的 ALL...对吗?
【问题讨论】:
@HimBromBeere 试过了,但我都得到了 它们都将在第一个匹配/不匹配的项目上停止(.All
将在第一个不匹配的项目上停止,.Any
将在第一个匹配的项目上停止)
不应该是第二个只是Any(r => !r.Deleted)
?
这是您问题的答案github.com/dotnet/BenchmarkDotNet
我投票结束这个问题,因为它是关于测量时差。
【参考方案1】:
看看如何Any
works internally:
public static bool Any<TSource>(this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
if (source == null)
throw Error.ArgumentNull("source");
if (predicate == null)
throw Error.ArgumentNull("predicate");
foreach (TSource local in source)
if (predicate(local))
return true;
return false;
因此,一旦找到一个评估为真的谓词,它就会停止。
以同样的方式,All
在判断为 false 的谓词时停止:
public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
if (source == null)
throw Error.ArgumentNull("source");
if (predicate == null)
throw Error.ArgumentNull("predicate");
foreach (TSource current in source)
if (!predicate(current))
return false;
return true;
所以我认为这里的答案是这两个选项应该相似或没有区别。
【讨论】:
我可能会建议说这两种方法之间的差异是非常确定的,基于您的数据。选择最终应取决于您测试的属性,并找到最有可能Short-Circuits First 的属性。这样就可以设置逻辑,使它们对同一组数据执行完全相同的操作。以上是关于C# Linq ANY vs ALL - 性能 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
LINQ 扩展方法 - Any() vs. Where() vs. Exists()
LINQ 学习路程 -- 查询操作 Quantifier Operators All Any Contain
LINQ体验——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains