C# 中的 .Any 和 .Count 更有效的是啥(扩展方法)[重复]

Posted

技术标签:

【中文标题】C# 中的 .Any 和 .Count 更有效的是啥(扩展方法)[重复]【英文标题】:What's more efficient in .Any and .Count in C# (Extension methods) [duplicate]C# 中的 .Any 和 .Count 更有效的是什么(扩展方法)[重复] 【发布时间】:2015-11-12 23:09:12 【问题描述】:
public void MethodName(ObservableCollection<DataCollection> dataCollection)
    
        if (dataCollection != null)
        
            IsChecked = dataCollection.Any(o => o.DataCollectionID.Equals(30));

            IsChecked = dataCollection.Where(o => o.DataCollectionID.Equals(30)).Count() > 0;
                    
    

谁能解释一下,从以上两种过滤中使用最有效的方法是什么? 。任何?或.Where.Count?

注意:考虑 dataCollection 有超过 10,000 个项目。

请给我建议。谢谢

【问题讨论】:

我的建议是自己测试一下。 使用Any,只要满足条件,方法就会终止。对于Count,它必须一直走到最后。这确实是您应该通过一些研究就能找到的东西。 over 10,000 items 这并不多。对我来说听起来像是微优化。这甚至是你的瓶颈吗?你的简介说什么?如果您只想为此进行微优化,请一起跳过 LINQ。或者至少只是 PLINQ。 【参考方案1】:

审查框架...这取决于。我在假设领域的最初直觉:

Any() 检查是否存在单个值。如果是这样,那么它 返回真。这是一个 O(1) 操作。

Count() 必须执行以下任一操作:

1) 访问集合中项目的运行计数,或 2) 计数 集合中的项目

在最好的情况下(#1),操作是 O(1)。在最坏的情况下,(#2),它是 O(n)。

实际上,Any() 使用集合的迭代器来确定是否存在下一个值。因此,Any() 是否是 O(1) 操作取决于集合。如果它是一个糟糕的实现,它可能是 O(n)。

例如,假设 Array 迭代器是愚蠢的,它会寻找第一个非空值。它必须检查数组中的每一项,因此Any() 在这种情况下意味着 O(n)。 (事实上​​,Any() 会为任何长度 > 1 的数组返回 true)。

Count() 尝试查看集合是否实现了ICollectionICollection&lt;T&gt;,如果是,则返回Count 属性的值。如果底层实现保持一个正在运行的选项卡,那可能是 O(1)。如果不是,则可能是 O(n) 最坏的情况。

如果可枚举的没有实现这些接口之一,Count() 只是迭代整个集合,在路上计数。这是 O(n)。

tl;dr:根据实现,Any() 更有可能比Count() 快得多。

【讨论】:

我相信数字 1 在最好的情况下是 O(1),但在平均情况下是 O(n/2)(所以 O(n))。数字 2 始终为 O(n)。显然数字 1 通常效率更高,但绝对不是每次都 O(1)(恒定时间)。 @johnnyRose 在一般情况下? (仅供参考,我现在正在检查源代码)......那将是一个糟糕的设计。您是否正在考虑数组末尾的一项?是的,我可以看到。 BRB。 O(1) for Any 将是最好的情况。并非总是如此。 @Habib 是的。检查来源会有所帮助。

以上是关于C# 中的 .Any 和 .Count 更有效的是啥(扩展方法)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

有C#基础学习VBA还是VSTO哪个更容易和有效

什么时候 ArrayList 比在 C# 中使用数组更有效? [复制]

将数据表写入excel的更有效方法?

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

编写高质量代码改善C#程序的157个建议——建议19:使用更有效的对象和集合初始化

在 C# 中播放声音更有效