C#中的.Any和.Count效率更高(扩展方法)

时间:2015-08-19 14:59:14

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

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个项目。

请指教。谢谢

1 个答案:

答案 0 :(得分:1)

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

  

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

     

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

     

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

     

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

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

例如,假设Array迭代器是愚蠢的,并查找第一个非null值。它必须检查数组中的每个项目,因此在这种情况下Any()表示O(n)。 (事实上​​,对于任何长度为&gt; 1的数组,Any()都会返回true

Count()尝试查看集合是否实现ICollectionICollection<T>,如果是,则返回Count属性的值。如果底层实现保持运行选项卡,则可以是O(1)。如果不是,那可能是O(n)最坏的情况。

如果可枚举的实现其中一个接口,Count()只是迭代整个集合,依赖于路径。那是O(n)。

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