【问题标题】: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。

标签: c# linq extension-methods generic-collections


【解决方案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 是的。检查来源会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 2010-09-29
相关资源
最近更新 更多