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】:

看看如何Anyworks 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 All,Any,Contains,自定义比较器

LINQ 扩展方法 - Any() vs. Where() vs. Exists()

LINQ 学习路程 -- 查询操作 Quantifier Operators All Any Contain

LINQ体验——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains

C# Any()和AII()方法

LINQ to SQL语句之Exists/In/Any/All/Contains