【问题标题】:C# Linq ANY vs ALL - Performance [closed]C# Linq ANY vs ALL - 性能 [关闭]
【发布时间】: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
  • 我投票结束这个问题,因为它是关于测量时差。

标签: c# performance linq


【解决方案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 的属性。这样就可以设置逻辑,使它们对同一组数据执行完全相同的操作。
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
相关资源
最近更新 更多