清单: Count vs Count()

给定一个列表,首选哪种方法来确定内部元素的数量?

var myList = new List<string>();


myList.Count
myList.Count()
184535 次浏览

MyList.Count 是 list 对象上的一个方法,它只返回字段的值,所以非常快。由于这是一个很小的方法,它很可能是由编译器(或运行时)内联的,因此它们可能允许编译器完成其他优化。

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

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

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

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

Count()是 LINQ 引入的扩展方法,而 Count属性是 List 本身的一部分(从 ICollection派生)。但是在内部,LINQ 检查您的 IEnumerable是否实现了 ICollection,如果实现了,它将使用 Count属性。所以在一天结束的时候,你用哪一个作为 List是没有区别的。

为了进一步证明我的观点,下面是 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;
}

与扩展方法 Count()相比,总是更喜欢类型上的 CountLength属性。前者是包含它们的每个类型的 O (1)。Count()扩展方法具有一些类型检查优化,这些优化可以导致它在 O (1)时间内运行,但是如果底层集合不是它所知道的为数不多的类型之一,那么它将降级为 O (N)。

如果您碰巧想要更改集合的类型,最好使用 Count()扩展。这样就不必重构代码(例如使用 Length)。