列表:Count vs Count() [重复]

Posted

技术标签:

【中文标题】列表:Count vs Count() [重复]【英文标题】:Lists: Count vs Count() [duplicate] 【发布时间】:2011-05-05 03:12:36 【问题描述】:

给定一个列表,确定里面的元素个数首选哪种方法?

var myList = new List<string>();

myList.Count
myList.Count()

【问题讨论】:

@Randy:根据变量的类型,最好使用 'var' 而不是 'Dictionary,int>'。这是一个偏好问题。 @Randy:不确定这与问题有关;这是一个风格选择(我也碰巧不同意,但讨论是针对不同的主题!)。 @Randy:为什么不呢?编译器知道类型,我为什么要写它?此外,你知道类型吗?它是什么? int? long?有关系吗?当然不是这个代码,或者大多数代码...... @Randy - 正如许多人所说,这是一个偏好问题,对于我不知道类型的情况,它更快:) ***.com/questions/737835/resharper-and-var/8796643 【参考方案1】:

Count() 是 LINQ 引入的扩展方法,而 Count 属性是 List 本身的一部分(派生自 ICollection)。但在内部,LINQ 会检查您的 IEnumerable 是否实现了 ICollection,如果实现了,则使用 Count 属性。因此,归根结底,List 使用哪个没有区别。

为了进一步证明我的观点,这里是来自 Reflector 的 Enumerable.Count() 代码

public static int Count<TSource>(this IEnumerable<TSource> source)

    if (source == null)
    
        throw Error.ArgumentNull("source");
    
    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
    
        return is2.Count;
    
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    
        while (enumerator.MoveNext())
        
            num++;
        
    
    return num;

【讨论】:

"So at the end of the day, there's no difference ..." 除了 LINQ 需要一天的时间来决定它使用内置函数 ;) 略有不同。 LINQ 必须检查它是否实现了 ICollection ......所以有一个小的(可能甚至不明显)命中来进行这个检查。 @BFree,我们如何在 VB.NET 中调用它? 从维护的角度来看,我建议使用Count(),以防您的类型从List 更改为其他没有Count 属性的IEnumerable。跨度> @juanora 这个答案是 11 年前的,所以当时我无法回答。然而,这些天来,那里有另一个检查非通用 ICollection 的情况,在这种情况下它返回 Count。见这里:github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/… Arrays 实现了 ICollection,因此 Arrays 也会被它拾取。【参考方案2】:

总是更喜欢类型的CountLength 属性,而不是扩展方法Count()。对于包含它们的每种类型,前者都是 O(1)。 Count() 扩展方法有一些类型检查优化,可以使其在 O(1) 时间内运行,但如果底层集合不是它所知道的少数类型之一,则会降级到 O(N)。

【讨论】:

仅供参考:如果您要检查是否存在任何内容,请使用 Any() 扩展方法。 @Greg 我更喜欢Count &gt; 0 而不是Any() 在 OP 的示例中(使用 List),绝对使用 Count>0。如果您使用的是 IEnumerable,则 Any() 在大多数情况下是首选,除非底层源本身可能是 List【参考方案3】:

myList.Count 是列表对象的一个​​方法,它只返回一个字段的值,所以非常快。由于它是一个小方法,它很可能被编译器(或运行时)内联,然后它们可能允许编译器完成其他优化。

myList.Count() 正在调用一个扩展方法(由 LINQ 引入)循环遍历 IEnumerable 中的所有项目,因此应该会慢很多。

但是(在 Microsoft 实现中)Count 扩展方法对 Lists 有一个“特殊情况”,允许它使用列表的 Count 属性,这意味着 Count() 方法只比 Count 属性慢一点。

您不太可能分辨出大多数应用程序的速度差异。

因此,如果您知道您正在处理一个 List,请使用 Count 属性,否则如果您有一个“未知”的 IEnumerabl,请使用 Count() 方法并让它为您优化。

【讨论】:

这不准确。如果您查看 Count() 方法的实现,它会检查 IEnumerable 是否实现了 ICollection,如果实现,则使用 Count 属性。所以他们在一天结束时都是一样的。 你能详细说明一下吗?内置是什么意思?【参考方案4】:

如果您想更改收藏的类型,最好使用Count() 扩展名。这样您就不必重构代码(例如使用Length)。

【讨论】:

使用 Count() 如果您决定使用不同类型的集合,那么您不必担心更改 1(因为 .Count() 将在它是一个数组、一个列表等时工作。 )

以上是关于列表:Count vs Count() [重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有`dplyr::count()`的标准评估[重复]

Android ListView.count vs ListView.size

我想删除列表的重复项,是否有可能在有条件的情况下使用count()函数?

Enumerable.Count() 与属性 Count [重复]

python实现给定一个列表判断里面是不是有重复元素

COUNT(*) vs. COUNT(1) vs. COUNT(pk):哪个更好? [复制]