Count属性vs Count()方法?

时间:2011-11-01 16:11:54

标签: c# linq list collections count

使用集合我有两种获取对象计数的方法; Count(属性)和Count()方法。谁知道关键的区别是什么?我可能错了,但我总是在任何条件语句中使用Count属性,因为我假设Count()方法对集合执行某种查询,其中Count必须在我获得之前已经分配。但这是猜测 - 如果我错了,我不知道表现是否会受到影响。

编辑:出于好奇,那么,如果集合为空,Count()会抛出异常吗?因为我很确定Count属性只返回0。

8 个答案:

答案 0 :(得分:91)

重新编译Count()扩展方法的源代码会显示它测试对象是ICollection(通用还是其他),如果是,则返回基础Count属性:

因此,如果您的代码访问Count而不是调用Count(),则可以绕过类型检查 - 理论上的性能优势,但我怀疑它是否会引人注意!

// System.Linq.Enumerable
public static int Count<TSource>(this IEnumerable<TSource> source)
{
    checked
    {
        if (source == null)
        {
            throw Error.ArgumentNull("source");
        }
        ICollection<TSource> collection = source as ICollection<TSource>;
        if (collection != null)
        {
            return collection.Count;
        }
        ICollection collection2 = source as ICollection;
        if (collection2 != null)
        {
            return collection2.Count;
        }
        int num = 0;
        using (IEnumerator<TSource> enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                num++;
            }
        }
        return num;
    }
}

答案 1 :(得分:29)

表现只是选择其中一个的一个原因。选择.Count()意味着您的代码将更通用。我有时会重构一些不再生成集合的代码,而是像IEnumerable那样更通用的东西,但是其他代码因为依赖于.Count而导致其更改,我不得不将其更改为{ {1}}。如果我指出在任何地方使用.Count(),代码可能会更可重用和可维护。通常选择使用更通用的界面,如果你可以逃脱它是你最好的选择。更通用的,我的意思是更简单的接口,它由更多类型实现,从而为您提供更强的代码兼容性。

我不是说.Count()更好,我只是说其他考虑因素更多地涉及您正在编写的代码的可重用性。

答案 2 :(得分:18)

.Count()方法可能足够聪明,或者知道有问题的类型,如果是,可能使用基础{{1} } property。

然后,它可能不会。

我认为可以安全地假设如果该集合本身具有.Count属性,那么在性能方面这将是您最好的选择。

如果.Count方法不知道该集合,它将枚举它,这将是一个O(n)操作。

答案 3 :(得分:5)

Count()方法是一种扩展方法,它迭代IEnumerable&lt;&gt;的每个元素。并返回有多少元素。如果IEnumerable的实例实际上是List&lt;&gt;,那么它被优化以返回Count属性而不是迭代所有元素。

答案 4 :(得分:3)

如果存在Count或Length属性,则应始终优先使用Count()方法,该方法通常迭代整个集合以计算其中的元素数。 (例外情况是,当Count()方法针对Linq to SQL或Linq to Entities源时,例如,在这种情况下,它将对数据源执行计数查询。即使这样,如果存在Count属性,您也会我希望更喜欢这样做,因为它的工作量可能较少。)

答案 5 :(得分:2)

Count()方法是适用于任何IEnumerable&lt;&gt;的LINQ方法。您可能希望Count()方法迭代整个集合以查找计数,但我相信LINQ代码实际上有一些优化来检测Count属性是否存在,如果存在则使用它。

所以他们都应该做几乎相同的事情。 Count属性可能略好一些,因为那里不需要进行类型检查。

答案 6 :(得分:2)

简短版本:如果您可以选择Count属性和Count()方法,请始终选择该属性。

差异主要在于操作效率。公开Count属性的所有BCL集合都以O(1)方式进行。 Count()方法虽然可以并且经常会花费O(N)。对于某些实现,有一些检查尝试将其转到O(1),但它绝不是保证。

答案 7 :(得分:1)

Count()作为LINQ的扩展方法 - CountList s上实际的.NET集合对象的属性。

因此,Count()几乎总是会变慢,因为它会枚举集合/可查询对象。在列表,队列,堆栈等上,使用Count。或者对于数组 - Length