为啥我应该使用 Any 方法而不是 Count? [复制]

Posted

技术标签:

【中文标题】为啥我应该使用 Any 方法而不是 Count? [复制]【英文标题】:Why should I use Any method instead of Count? [duplicate]为什么我应该使用 Any 方法而不是 Count? [复制] 【发布时间】:2012-09-18 02:59:48 【问题描述】:

可能重复:Which method performs better: .Any() vs .Count() > 0?

我只是想知道为什么我应该使用Any() 而不是Count()?,如果我们以msdn 为例:

class Pet

    public string Name  get; set; 
    public int Age  get; set; 

class Person

    public string LastName  get; set; 
    public Pet[] Pets  get; set; 


public static void AnyEx2()

    List<Person> people = new List<Person>
         new Person  LastName = "Haas",
                       Pets = new Pet[]  new Pet  Name="Barley", Age=10 ,
                                          new Pet  Name="Boots", Age=14 ,
                                          new Pet  Name="Whiskers", Age=6 ,
          new Person  LastName = "Fakhouri",
                       Pets = new Pet[]  new Pet  Name = "Snowball", Age = 1,
          new Person  LastName = "Antebi",
                       Pets = new Pet[]  ,
          new Person  LastName = "Philips",
                       Pets = new Pet[]  new Pet  Name = "Sweetie", Age = 2,
                                          new Pet  Name = "Rover", Age = 13 
        ;

    // Determine which people have a non-empty Pet array.
    IEnumerable<string> names = from person in people
                            where person.Pets.AsQueryable().Any()
                            select person.LastName;

    foreach (string name in names)
        Console.WriteLine(name);

    /* This code produces the following output:

       Haas
       Fakhouri
       Philips
    */

如果我用了会怎样:

  IEnumerable<string> names = from person in people
                            where person.Pets.Count() > 0
                            select person.LastName;

它会给出相同的结果! , (我不认为它是为了简短或什么而创建的),Any() 有什么功能吗??

【问题讨论】:

查看这篇文章:Which method performs better any vs count 有人递给你一个米袋,问“有米粒吗?”。你是:看看是否有“任何”大米(至少一粒谷物),还是 b:坐下来数一数,只在完成后报告是/否? 因为它是命中一个数组,所以“count>0”要快得多(在这种情况下是 11X)。我刚刚对上面的代码进行了基准测试(将 Console.Writeline 移出),“count >0”花费了 1400 个滴答声,而 any() 花费了 15100 个滴答声! [x64,发布模式,未附加调试器]。这是因为 Any() 必须创建和销毁对象。但是,对于数据库连接,通常情况相反。 Any() 通常表现更好。 【参考方案1】:

Any 只检查序列是否包含至少一个元素,而Count 需要遍历所有元素。这就是区别。 Any 优于 Count 的经典场景是这样的:

if (sec.Count() > 0)

if (sec.Any())

【讨论】:

想象一下如果你尝试Count一个无限序列会发生什么...... @Claudio ,它只是使用 Any 吗?重载了怎么办? 对于重载也是如此,Any 一旦找到满足谓词的第一个元素就停止,而 Count 必须扫描整个序列(可能是无限的,如前所述)。【参考方案2】:

根据IEnumerable&lt;&gt; 的具体实现 隐藏在接口后面,Any 可能比Count 快得多。例如,如果实际上有 LINQ-to-SQL 或其他一些数据库提供程序,则可能是检查表中 至少 1 条记录或必须计数 每个 记录之间的区别strong> 记录在数据库中。

但是,在我看来,更重要的原因是使用Any() 比检查Count() &gt; 0 更能表达您的意图。它询问“有任何物品吗?”而不是“找出有多少项目。这个数字是否大于零”。对你来说,“有什么物品吗?”的哪个翻译更自然? ?

【讨论】:

我喜欢这个答案,一般来说,您必须记住,Linq 可能必须与查询提供程序一起工作,这可能会将表达式翻译成其他东西(如 SQL),因此表达 INTENT 很重要, Any() 的意图可能对应于与您在执行 Count() 时所需的完全不同的物理操作。【参考方案3】:

实际上,这取决于。

如果您的集合是 IEnumerable 的形式,则 Count() 方法将遍历所有元素,而 Any() 则不必这样做。因此,对于可枚举, Any() 将具有(潜在的显着)性能优势。

然而,在您的示例中,Pets 是一个数组,因此您最好使用 .Length 而不是 .Count()。在这种情况下,性能不会有显着差异。

【讨论】:

【参考方案4】:

要获得计数,代码必须遍历整个序列。在一个长的、延迟执行的序列上,这可能会花费大量时间。由于我只想知道序列是否包含一个或多个元素,因此使用 Any() 扩展方法计算效率更高。

阅读:Eric Lippert's Blog

也可供阅读:Count() and Count property

【讨论】:

以上是关于为啥我应该使用 Any 方法而不是 Count? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我要在特征上实现方法而不是作为特征的一部分?

为啥我应该使用基于块的动画而不是开始/结束动画?

我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]

为啥我们应该使用 RNN 而不是马尔可夫模型?

我应该总是更喜欢 EXISTS 而不是 SQL 中的 COUNT() > 0 吗?

为啥我不能使用 list 的 count 方法? [复制]